CREATE OR REPLACE
PROCEDURE "p*_d******"
(V_Day IN CHAR, v_Pk_List IN CHAR,
v_Log OUT VARCHAR2, v_Msg OUT VARCHAR2)
is
--v_Pk_List VARCHAR2(50);
v_DSQL1 VARCHAR2(2000);
v_DSQL2 VARCHAR2(2000);
V_COUNT NUMBER(10);
V_Today_Day VARCHAR2(20);
V_START_TS TIMESTAMP(2);
v_Errormsg VARCHAR2(100);
V_PK NUMBER(10);
CURSOR pk_cur IS
SELECT *
FROM ( SELECT TRIM (REGEXP_SUBSTR (num_csv,
'[^,]+',
1,
LEVEL))
num_value
FROM ( SELECT v_Pk_List num_csv FROM DUAL)
CONNECT BY LEVEL <= regexp_count (num_csv, ',', 1) + 1)
WHERE num_value IS NOT NULL;
BEGIN
SELECT TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH:MI:SS AM') INTO V_START_TS FROM DUAL;
IF
NOT pk_cur%ISOPEN THEN
OPEN pk_cur;
END IF;
BEGIN
LOOP
FETCH pk_cur INTO V_PK;
EXIT WHEN pk_cur%NOTFOUND;
SELECT COUNT(*)
INTO V_COUNT
FROM
***_***_******
WHERE
RUN_MODE =V_DAY
AND PK_ID=V_PK;
IF
V_COUNT<=0 THEN
EXECUTE IMMEDIATE 'INSERT INTO ***_***_******
(
fact********,
PK_ID,
pr**_d*****,
RUN_MODE,
CREATE_DATE
)
SELECT fact********,
PK_ID,
DUEDATE,
'''||V_DAY||''',
SYSTIMESTAMP
FROM ***_***_*********
WHERE PK_ID ='''||V_PK||'''';
v_Errormsg :='INSERT SUCCESSFULL FOR';--||V_DAY||'AND PK_ID'||V_PK;
EXECUTE IMMEDIATE 'INSERT INTO u**_s*****_e***_l**(MODULENAME,PROCEDURENAME,PKID,MODELID,LEVELID,COL_1,COL_2,ERRORMSG,ERRORTRACE,START_TS,END_TS)
VALUES(''EMEA_PROCESS'',
''p*_d******'',
'''||v_Pk_List||''',
NULL,
NULL,
''SUCCESS'',
'''||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||''',
NULL,
NULL,
'''||V_START_TS||''',
SYSTIMESTAMP)';
BEGIN
EXCEPTION WHEN OTHERS THEN
v_Errormsg := 'ERROR: p*_d****** PROCEDURE INSERT ERROR' ;--|| 'ERROR_MSG IS '||SQLERRM;
EXECUTE IMMEDIATE 'INSERT INTO u**_s*****_e***_l**(MODULENAME,PROCEDURENAME,PKID,MODELID,LEVELID,COL_1,COL_2,ERRORMSG,ERRORTRACE,START_TS,END_TS)
VALUES(''????'',
''p*_d******'',
'''||v_Pk_ID||''',
NULL,
NULL,
'''||v_Errormsg||''',
'''||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||''',
NULL,
NULL,
'''||V_START_TS||''',
SYSTIMESTAMP)';
END;
END IF;
EXECUTE IMMEDIATE 'MERGE INTO ***_***_********* GFO
USING
***_***_****** UFD
ON (GFO.fact********=UFD.fact********)
WHEN MATCHED THEN
UPDATE
SET
GFO.pr**_d*****=UFD.pr**_d*****
WHERE UFD.CREATE_DATE IS NOT NULL
AND UFD.RUN_MODE= '''||V_DAY||'''
AND GFO.PK_ID='''||V_PK||'''';
v_Errormsg :='pr**_d***** OF GFO UPDATED FOR ';--||V_DAY||' AND PK_ID '||V_PK;
EXECUTE IMMEDIATE 'INSERT INTO u**_s*****_e***_l**(MODULENAME,PROCEDURENAME,PKID,MODELID,LEVELID,COL_1,COL_2,ERRORMSG,ERRORTRACE,START_TS,END_TS)
VALUES(''EMEA_PROCESS'',
''p*_d******'',
'''||v_Pk_List||''',
NULL,
NULL,
''SUCCESS'',
'''||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||''',
NULL,
NULL,
'''||V_START_TS||''',
SYSTIMESTAMP)';
BEGIN
EXCEPTION WHEN OTHERS THEN
v_Errormsg := 'ERROR: p*_d****** PROCEDURE INSERT ERROR';-- || 'ERROR_MSG IS '||SQLERRM;
EXECUTE IMMEDIATE 'INSERT INTO u**_s*****_e***_l**(MODULENAME,PROCEDURENAME,PKID,MODELID,LEVELID,COL_1,COL_2,ERRORMSG,ERRORTRACE,START_TS,END_TS)
VALUES(''????'',
''p*_d******'',
'''||v_Pk_ID||''',
NULL,
NULL,
'''||v_Errormsg||''',
'''||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||''',
NULL,
NULL,
'''||V_START_TS||''',
SYSTIMESTAMP)';
END;
EXECUTE IMMEDIATE 'MERGE INTO ***_***_****** UFD
USING
***_***_********* GFO
ON (UFD.fact********=GFO.fact********)
WHEN MATCHED THEN
UPDATE
SET
UFD.pr**_d*****=GFO.DUEDATE
WHERE
GFO.PK_ID='''||V_PK||'''';
v_Errormsg :='pr**_d***** OF UFD BACKED UP IN GFO FOR ';--||V_DAY||' AND PK_ID '||V_PK;
EXECUTE IMMEDIATE 'INSERT INTO u**_s*****_e***_l**(MODULENAME,PROCEDURENAME,PKID,MODELID,LEVELID,COL_1,COL_2,ERRORMSG,ERRORTRACE,START_TS,END_TS)
VALUES(''EMEA_PROCESS'',
''p*_d******'',
'''||v_Pk_List||''',
NULL,
NULL,
''SUCCESS'',
'''||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||''',
NULL,
NULL,
'''||V_START_TS||''',
SYSTIMESTAMP)';
BEGIN
EXCEPTION WHEN OTHERS THEN
v_Errormsg := 'ERROR: p*_d****** PROCEDURE INSERT ERROR';--||'ERROR_MSG IS '||SQLERRM;
EXECUTE IMMEDIATE 'INSERT INTO u**_s*****_e***_l**(MODULENAME,PROCEDURENAME,PKID,MODELID,LEVELID,COL_1,COL_2,ERRORMSG,ERRORTRACE,START_TS,END_TS)
VALUES(''????'',
''p*_d******'',
'''||v_Pk_ID||''',
NULL,
NULL,
'''||v_Errormsg||''',
'''||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||''',
NULL,
NULL,
'''||V_START_TS||''',
SYSTIMESTAMP)';
END;
END LOOP;
END;
END p*_d******;
我收到所有 3 个异常块的以下错误:
错误(100,3(: PLS-00103:预期出现以下情况之一时遇到符号"异常":( 开始案例 声明退出 转到 如果循环 mod 空编译指示 提高返回 选择更新 同时<<继续关闭当前删除 获取锁定 插入打开回滚 保存点设置 SQL 执行所有合并管道清除的提交
你的代码有很多问题。 编译错误的直接原因是匿名块的结构不正确:BEGIN 和 EXCEPTION 关键字之间必须有一些代码。 您需要重新考虑异常处理,也许可以通过使用执行的代码和定制的错误处理来定义块。
例如,对代码最后一段的重新转换将两个带有定制错误消息的语句放在一个匿名块中,并带有自己的 Exception 部分:
BEGIN
v_Errormsg := 'ERROR: p*_d****** PROCEDURE INSERT ERROR';--||'ERROR_MSG IS '||SQLERRM;
EXECUTE IMMEDIATE 'MERGE INTO ***_***_****** UFD
USING
....';
v_Errormsg :='pr**_d***** OF UFD BACKED UP IN GFO FOR ';--||V_DAY||' AND PK_ID '||V_PK;
EXECUTE IMMEDIATE 'INSERT INTO u**_s*****_e***_l**(MODULENAME,PROCEDURENAME,PKID,MODELID,LEVELID,COL_1,COL_2,ERRORMSG,ERRORTRACE,START_TS,END_TS)
VALUES(''EMEA_PROCESS'',
....';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE 'INSERT INTO u**_s*****_e***_l**(MODULENAME,PROCEDURENAME,PKID,MODELID,LEVELID,COL_1,COL_2,ERRORMSG,ERRORTRACE,START_TS,END_TS)
VALUES(''????'',
...
END;
它将编译(可能,我不会尝试重新创建您的环境来测试它(。 但这只能解决部分问题。
您的程序有很多重复,这总是一个不好的迹象。 我们应该设计一个过程来重用通用功能,而不是依赖于剪切粘贴。
但最令人不安的是动态SQL的使用。 真的没有必要。 我们可以在普通SQL中使用PL/SQL变量。 动态SQL很难正确,因为任何编译错误都会变成运行时错误。 只有在别无选择的情况下,我们才应该使用动态 SQL。