Eftersom du komponerade SQL-satsen som en sträng, ersätter PLSQL-motorn INTE variabelnamnet (deras bara en del av en bokstavlig sträng), därför ser SQL-motorn strängen 'V_MONTH' men det finns ingen kolumn med det namnet och därför är en ogiltig identifierare . Om du stannar med dynamisk SQL måste du göra värdesubstitution själv. Detsamma gäller även de andra variablerna. Så:
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);
Du kan också behöva göra nödvändiga formatkonverteringar.