动态查询中v_MONTH的无效标识符错误

时间:2019-07-15 18:16:10

标签: oracle plsql

我正在包装内执行以下过程,以将条目发布到表ledger_stat_dly中。 我编写了动态查询来替换案例语句,但遇到以下错误。 您能否建议在过程中正确定义V_Month is invalid identifier时为什么会弹出错误。 在此先感谢您的帮助。

Error is:
ORA-00904: "V_MONTH": invalid identifier
    (
        V_IDENTITY_CODE      NUMBER,    
        V_CONSOLIDATION_CD   NUMBER,    
        V_FINANCIAL_ELEM_ID  NUMBER,    
        V_ORG_UNIT_ID        NUMBER,   
        V_GL_ACCOUNT_ID      NUMBER,    
        V_COMMON_COA_ID      NUMBER,   
        V_PRODUCT_1_ID       NUMBER,   
        V_PRODUCT_ID         NUMBER,   
        V_PRODUCT_3_ID       NUMBER,    
        V_DATE               DATE,        
        V_AMOUNT             NUMBER,    
        V_MEMO_GL_ACCOUNT_ID NUMBER DEFAULT 0,  
        V_POSTINGTYPE        CHAR DEFAULT 'N', 
        V_BALANCE_TYPE_CD    NUMBER DEFAULT 0 
)
IS

V_CNT NUMBER;
V_MONTH CHAR(2);
V_MO NUMBER;
V_YEAR_S NUMBER;

-- variables store result of dynamic cursor
V_SL   VARCHAR2(2500);
V_TARGET_COLUMN VARCHAR2(6 CHAR);

BEGIN              


   IF V_POSTINGTYPE = 'N' THEN

        IF NVL(V_AMOUNT,0) <> 0  THEN

                V_MO := (MONTH(V_DATE));
                V_MONTH := LPAD(V_MO,2,'0');
                V_YEAR_S := (YEAR(V_DATE));
                V_TARGET_COLUMN := CONCAT('DAY_',LPAD(TO_CHAR(DAY(V_DATE)),2,'0'));              

                    EXECUTE IMMEDIATE UTL_LMS.FORMAT_MESSAGE('UPDATE /*+ index(a LEDGER_STAT_DLY_IDX02_IN) */ LEDGER_STAT_DLY A
                           SET %s =  NVL(%s,0) + NVL(V_AMOUNT,0)
                           WHERE IDENTITY_CODE =  NVL(V_IDENTITY_CODE,0)
                              AND YEAR_S =  NVL(V_YEAR_S,0)
                              AND MONTH_NO = NVL(V_MONTH,0)',V_TARGET_COLUMN, V_TARGET_COLUMN);


        END IF; 

    END IF;  --CLOSURE FOR POSTING TYPE IF STATEMENT



END IN_LEDGER_STAT_DAILY;

1 个答案:

答案 0 :(得分:1)

因为您将SQL语句组成为字符串,所以PLSQL引擎不会替换变量名(它们只是文字字符串的一部分),因此SQL引擎会看到字符串'V_MONTH',但该名称没有列因此无效的标识符。如果您使用动态SQL,则必须自己进行值替换。其他变量也一样。所以:

  EXECUTE IMMEDIATE UTL_LMS.FORMAT_MESSAGE(
  'UPDATE /*+ index(a LEDGER_STAT_DLY_IDX02_IN) */ LEDGER_STAT_DLY A
      SET %s =  NVL(%s,0) + NVL(%s ,0)
    WHERE IDENTITY_CODE =  NVL(%s ,0)
      AND YEAR_S =  NVL(%s ,0)
      AND MONTH_NO = NVL(%s ,0)'
     ,V_TARGET_COLUMN, V_TARGET_COLUMN ,V_AMOUNT,V_IDENTITY_CODE,V_YEAR_S,V_MONTH);

您可能还需要进行任何必要的格式转换。