【问题标题】:Need to put TRY - CATCH in oracle stored procedure需要在oracle存储过程中放入TRY-CATCH
【发布时间】:2015-12-09 12:19:03
【问题描述】:

我已经创建了用于在多个表上创建 unique index 的 SP。

现在我需要为此创建 Try-catch(异常处理),例如未创建的 incase 索引应该是 catch ....

例如,我有 200 个表,只有 1 个表出错,那么应该使用索引创建 199 个表,并且捕获日志具有那个错误的表名。

请帮忙。

DECLARE
CURSOR C_TABLE IS
SELECT INPUT_TABLE,HISTORY_TABLE FROM FUNCTIONS WHERE TARGET_SYS IN ('ABC','DEC') AND ACTIVE_FLAG='Y';

SQL_CREATE_INX VARCHAR2(200);
SQL_TABLE_NAME VARCHAR2(200);

BEGIN
-- INPUT TABLE
    FOR I IN C_TABLE
    LOOP

        SQL_CREATE_INX:='CREATE UNIQUE INDEX CLM1.AUDIT_SUB_SITE_INX ON '||I.INPUT_TABLE||' (AUDIT_NBR , SUB_AUDIT_NBR , STATE) ';
        SQL_TABLE_NAME:=I.INPUT_TABLE;
        EXECUTE IMMEDIATE SQL_CREATE_INX;

        DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);

    END LOOP;
    DBMS_OUTPUT.PUT_LINE('INDEXES CREATED FOR ALL INPUT TABLES');

    -- OUTPUT TABLE
    FOR H IN C_TABLE
    LOOP

        SQL_CREATE_INX:='CREATE UNIQUE INDEX CLM1.AUDIT_SUB_SITE_INX ON '||H.HISTORY_TABLE||' (AUDIT_NBR , SUB_AUDIT_NBR , STATE)  ';
        SQL_TABLE_NAME:=H.HISTORY_TABLE;
        EXECUTE IMMEDIATE SQL_CREATE_INX;

        DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);

    END LOOP;
    DBMS_OUTPUT.PUT_LINE('INDEXES CREATED FOR ALL OUTPUT TABLES');


END;

【问题讨论】:

    标签: sql oracle stored-procedures plsql


    【解决方案1】:

    您需要将所有EXEC IMMEDIATE 包含在BEGIN .. END

      FOR (.... )
      LOOP
          /*
           *  Other Statements
           */
          BEGIN  /* try */
                EXECUTE IMMEDIATE SQL_CREATE_INX;
    
                /* If it is success the below output happens */
                DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);
          EXCEPTION /*catch */
          /* It is like catch(Exception e) All execeptions go here..*/
          WHEN OTHERS THEN
              /* Log your error message here.. SQLERRM has it..*/
              DBMS_OUTPUT.PUT_LINE('DDL FAILED FOR '||SQL_TABLE_NAME||'::FAILED WITH ERROR::'||SQLERRM);
          END;
           /*
            *  Other Statements
            */
       END LOOP;
    

    【讨论】:

    • 我正在为所有表做 LOOP,为什么我在 LOOP 下写了 EXECUTE IMMEDIATE .. 请帮助
    • 没问题.. LOOP 保持相同.. 更新模板。所以现在如果发出 100 个 ddls,所有这些都将被尝试,不管它是什么。当我们捕获异常时。
    【解决方案2】:

    在oracle中对异常的处理如下

    Declare
    --declaration 
    BEGIN
       --executable_section
    
    EXCEPTION
       WHEN exception_name1 THEN
          [statements]
    
       WHEN exception_name2 THEN
          [statements]
    
       WHEN exception_name_n THEN
          [statements]
    
       WHEN OTHERS THEN
          [statements]
    
    END 
    

    通过编辑带有异常块的过程如下

        DECLARE
        CURSOR C_TABLE IS
        SELECT INPUT_TABLE,HISTORY_TABLE FROM FUNCTIONS WHERE TARGET_SYS IN ('ABC','DEC') AND ACTIVE_FLAG='Y';
        var1 number;
        var2 number;
        SQL_CREATE_INX VARCHAR2(200);
        SQL_TABLE_NAME VARCHAR2(200);
    
        BEGIN
        -- INPUT TABLE
            FOR I IN C_TABLE
            LOOP
        select 1 into var1 from user_tables where table_name=upper(i.INPUT_TABLE)
      if var1=1
     then
                SQL_CREATE_INX:='CREATE UNIQUE INDEX CLM1.AUDIT_SUB_SITE_INX ON '||I.INPUT_TABLE||' (AUDIT_NBR , SUB_AUDIT_NBR , STATE) ';
                SQL_TABLE_NAME:=I.INPUT_TABLE;
                EXECUTE IMMEDIATE SQL_CREATE_INX;
    
                DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);
        end if;
            END LOOP;
            DBMS_OUTPUT.PUT_LINE('INDEXES CREATED FOR ALL INPUT TABLES');
    
            -- OUTPUT TABLE
            FOR H IN C_TABLE
            LOOP
         select 1 into var2 from user_tables where table_name=upper(h.HISTORY_TABLE)
      if var2=1
     then
                SQL_CREATE_INX:='CREATE UNIQUE INDEX CLM1.AUDIT_SUB_SITE_INX ON '||H.HISTORY_TABLE||' (AUDIT_NBR , SUB_AUDIT_NBR , STATE)  ';
                SQL_TABLE_NAME:=H.HISTORY_TABLE;
                EXECUTE IMMEDIATE SQL_CREATE_INX;
    
                DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);
        end if;
            END LOOP;
            DBMS_OUTPUT.PUT_LINE('INDEXES CREATED FOR ALL OUTPUT TABLES');
        exception 
       WHEN OTHERS THEN
        Dbms_output.put_line(sqlerrm ||' error occured with this error code '||SQLCODE);
    
    END;
    

    一些 Predefined exceptions in oracle 并使用您的异常名称编辑 plsql 块。

    【讨论】:

    • 感谢您的帮助。我有问题.. 1. Incase 未找到一张表或无法创建索引。休息199会做吗? ... 2. 我需要定义所有异常名称?我无法在输出中打印出来.... TRY CATCH 在这里工作????
    • @user2197712 更新了我的帖子以及表格检查和错误处理现在检查它,如果您遇到任何错误,请告诉我。
    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2015-10-11
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多