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



我在包内运行以下过程以在表 ledger_stat_dly 中发布条目。我已经编写了动态查询来替换 case 语句,但我面临以下错误。您能否建议为什么在程序中正确定义时弹出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;

因为您将 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);

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

最新更新