我在一个函数里使用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怎么区分?

解决方案 »

  1.   

    道理似乎是这样,decode的第一个参数是字段名称,只能在 sql 语句(select, insert, delete, update)引用表的字段名称。
      

  2.   

    感觉LZ的逻辑有些混乱,if嵌套when...
      

  3.   

    SL. 是什么东西?pl/sql和sql没什么区别,只是你语句和过程有区别,语句可用,为什么不用selcect into呢?
      

  4.   

    不好意思,function里的SL.被我弄错了,应该是str.
      

  5.   

    我明白了,也就是decode的第一个参数被我写成str.valname是不行的,因为str只是一个变量,不是一张表(或表的别名)!十分感谢!!
    不过,我还想问下,如果我想在那个function里用decode的话,该怎样做呢?
      

  6.   

    汗,突然发现自己问了个愚蠢的问题,decode里可以直接饮用str这个变量了,不需要再在后面加一个valname