decode不能用在plsql中?
时间:2011-12-16
来源:互联网
我在一个函数里使用decode时出错,看了下网上说decode不能用在plsql里,只能用在sql里,但我对这句话还不理解,希望大家能再指点指点:
一开始是用在一个包的procedure里:
INSERT INTO HQY_SERV_47_SL
SELECT 字段1 ,
字段2 ,
CASE WHEN INSTR(SL.VALNAME,',')>1 THEN ……
WHEN …… THEN ……
ELSE DECODE(REPLACE(SL.VALNAME, 'ADSL ', ''), '下行128k', '2', '512k', '8', NULL)
END
FROM HQY_IB_SERVCHAR SL,
HQY_CRM_SERV_47 CS47
WHERE CS47.SERV_ID=SL.SERV_ID(+)
这样是没有问题的,但因为case when需要多次被使用,所以我把它打包到一个function里了:
create or replace function get_valname_number(str varchar2)
return varchar2 is
V_RSTR varchar2(255);
begin
if str is null then
return null;
else
V_RSTR := CASE WHEN INSTR(SL.VALNAME,',')>1 THEN ……
WHEN …… THEN ……
ELSE DECODE(REPLACE(SL.VALNAME, 'ADSL ', ''), '下行128k', '2', '512k', '8', NULL)
END;
return V_RSTR;
end if;
end;
然后在包里procedure调用这个function:
INSERT INTO HQY_SERV_47_SL
SELECT 字段1 ,
字段2 ,
GET_VALNAME_NUMBER(SL.VALNAME)
FROM HQY_IB_SERVCHAR SL,
HQY_CRM_SERV_47 CS47
WHERE CS47.SERV_ID=SL.SERV_ID(+)
结果报错了:function or pseudo-column 'DECODE' may be used inside a SQL
我只好把function里的decode也改成case when才行,为什么在function里使用会报错呢?plsql跟sql怎么区分?
一开始是用在一个包的procedure里:
INSERT INTO HQY_SERV_47_SL
SELECT 字段1 ,
字段2 ,
CASE WHEN INSTR(SL.VALNAME,',')>1 THEN ……
WHEN …… THEN ……
ELSE DECODE(REPLACE(SL.VALNAME, 'ADSL ', ''), '下行128k', '2', '512k', '8', NULL)
END
FROM HQY_IB_SERVCHAR SL,
HQY_CRM_SERV_47 CS47
WHERE CS47.SERV_ID=SL.SERV_ID(+)
这样是没有问题的,但因为case when需要多次被使用,所以我把它打包到一个function里了:
create or replace function get_valname_number(str varchar2)
return varchar2 is
V_RSTR varchar2(255);
begin
if str is null then
return null;
else
V_RSTR := CASE WHEN INSTR(SL.VALNAME,',')>1 THEN ……
WHEN …… THEN ……
ELSE DECODE(REPLACE(SL.VALNAME, 'ADSL ', ''), '下行128k', '2', '512k', '8', NULL)
END;
return V_RSTR;
end if;
end;
然后在包里procedure调用这个function:
INSERT INTO HQY_SERV_47_SL
SELECT 字段1 ,
字段2 ,
GET_VALNAME_NUMBER(SL.VALNAME)
FROM HQY_IB_SERVCHAR SL,
HQY_CRM_SERV_47 CS47
WHERE CS47.SERV_ID=SL.SERV_ID(+)
结果报错了:function or pseudo-column 'DECODE' may be used inside a SQL
我只好把function里的decode也改成case when才行,为什么在function里使用会报错呢?plsql跟sql怎么区分?
作者: heqiyu34 发布时间: 2011-12-16
可以用的,应该是的语法有问题
作者: yinan9 发布时间: 2011-12-16
道理似乎是这样,decode的第一个参数是字段名称,只能在 sql 语句(select, insert, delete, update)引用表的字段名称。
作者: ruihuahan 发布时间: 2011-12-16
感觉LZ的逻辑有些混乱,if嵌套when...
作者: yinan9 发布时间: 2011-12-16
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28