ORA-00904无效标识符 - 动态Oracle函数

时间:2016-11-21 17:47:44

标签: oracle plsql

    create or replace 
    FUNCTION JDT_UDC_Desc
    (
     V_SY IN VARCHAR2,
      V_RT IN VARCHAR2,
      V_KY IN VARCHAR2
    )
    RETURN VARCHAR2
    AS
       V_DL01 VARCHAR2(30);


BEGIN



   EXECUTE IMMEDIATE 'select drdl01 
       from PRODCTL.F0005
              WHERE DRSY = V_SY
     AND DRRT = V_RT
      AND ltrim(rtrim(drky)) =ltrim(rtrim(V_KY))'
INTO V_DL01
using V_SY,V_RT,V_KY;
END;

汇编。我点击运行并输入以下值:

 V_SY ='00',
V_RT = '01',
V_KY='04';

我得到以下错误

  

ORA-00904 V_KY标识符无效

有谁能帮我理解这个错误的原因?

2 个答案:

答案 0 :(得分:2)

您在语句中传递文字值'V_SY','V_RT'和'V_KY',并将它们解释为列名,因此无效标识符错误。您需要使用变量占位符,如:

 EXECUTE IMMEDIATE 'select drdl01 
          from PRODCTL.F0005
          WHERE DRSY = :1
          AND DRRT = :2
          AND ltrim(rtrim(drky)) =ltrim(rtrim(:3))'
 INTO V_DL01
 using V_SY,V_RT,V_KY;

答案 1 :(得分:1)

首先,似乎没有任何理由在这里使用动态SQL。您需要求助于动态SQL应该是很少见的 - 您的代码将更高效,更易于维护。

create or replace 
    FUNCTION JDT_UDC_Desc
    (
      V_SY IN VARCHAR2,
      V_RT IN VARCHAR2,
      V_KY IN VARCHAR2
    )
    RETURN VARCHAR2
    AS
       V_DL01 VARCHAR2(30);
    BEGIN
      select drdl01 
        into V_DL01
        from PRODCTL.F0005
       WHERE DRSY = V_SY
         AND DRRT = V_RT
         AND trim(drky) =trim(V_KY);

      return v_dl01;
    END;

其次,如果为列和表选择有意义的变量名和有意义的名称,那将非常有用。 F0005不会告诉您表中包含的内容。 v_sydrsy不会告诉您变量或列应包含的内容。这将使维护此代码变得更加困难。