PL/SQL 的所有 3 个异常块中都有错误


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。

相关内容

最新更新