+ -
当前位置:首页 → 问答吧 → decode不能用在plsql中?

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怎么区分?

作者: 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

热门下载

更多