1

当并行查询服务器返回错误时,我很难弄清楚如何处理 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 <TBS>

反而 :

ORA-12801: error signaled in parallel query server P001

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

非常感谢。

4

2 回答 2

2

捕获错误(需要 WHEN OTHERS 的罕见情况)并使用 DBMS_Utility.Format_Error_Stack 读取底层错误。

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

于 2013-09-09T18:39:47.243 回答
1

好的,使用 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;
于 2013-09-10T12:17:29.173 回答