我在包内运行以下过程以在表 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);
您可能还需要进行任何必要的格式转换。