【问题标题】:Handle exceptions returned by parallel query server处理并行查询服务器返回的异常
【发布时间】:2013-09-09 14:56:54
【问题描述】:

当并行查询服务器返回错误时,我很难弄清楚如何在 PL/SQL 中处理异常。

考虑以下几点:

BEGIN                   

    EXECUTE IMMEDIATE('ALTER <SOME_INDEX> REBUILD PARALLEL(4) );

EXCEPTION

    WHEN OTHERS THEN

    IF SQLCODE = -01652 THEN

        DBMS_OUTPUT.PUT_LINE('Not enought space');

    ELSE

        DBMS_OUTPUT.PUT_LINE('[SQLCODE] -> '||SQLERRM);
        NULL;

    END IF;

END;

我正在尝试处理 ORA-01652 以通知表空间已满。

这里的问题是我没有抓住:

ORA-01652 unable to extend temp segment by 128 in tablespace &lt;TBS&gt;

而是:

ORA-12801: error signaled in parallel query server P001

所以 ORA-01652 没有存储在 SQLCODE 中。我该如何处理这里真正的异常?

非常感谢。

【问题讨论】:

    标签: exception plsql parallel-processing oracle11g


    【解决方案1】:

    捕获错误(在极少数情况下需要 WHEN OTHERS)并使用 DBMS_Utility.Format_Error_Stack 读取底层错误。

    http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_util.htm#sthref9680

    【讨论】:

    • 非常感谢,但这并不是我所需要的。我添加了 DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);它会返回两个异常,但我需要测试第二个异常的错误代码,以便在它是 ORA-01652 时打印一条消息。我怎样才能使用这种方法做到这一点?
    • 我希望您必须解析 Format_Error_Stack 的返回值。
    • 哦,我明白了,就像使用字符串操作函数分解返回的字符串以分析内部的不同错误代码对吧?如果这就是你的意思,我需要先学习如何做到这一点! :)
    • 是的,听起来就是这样。
    【解决方案2】:

    好的,使用 David Aldridge 的建议解决了问题。如果有人遇到类似问题,这是我想出的解决方案,使用 INSTR 函数:

    BEGIN                   
    
        EXECUTE IMMEDIATE('ALTER <SOME_INDEX> REBUILD PARALLEL (DEGREE 4));
    
    EXCEPTION
    
        WHEN OTHERS THEN
    
            -- If the error_stack contains the error code, then the error obviously occured
            -- INSTR will return the position of the string we are looking for
            -- otherwise, it will just return 0, hence the search condition :
    
            IF INSTR(DBMS_UTILITY.FORMAT_ERROR_STACK,'ORA-01658') > 0 THEN
    
                DBMS_OUTPUT.PUT_LINE('Tablespace full, too bad!');
    
            ELSE
    
                DBMS_OUTPUT.PUT_LINE('ERROR : '||DBMS_UTILITY.FORMAT_ERROR_STACK);
    
            END IF;
    
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      相关资源
      最近更新 更多