处理并行查询服务器返回的异常
Posted
技术标签:
【中文标题】处理并行查询服务器返回的异常【英文标题】: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 <TBS>
而是:
ORA-12801: error signaled in parallel query server P001
所以 ORA-01652 没有存储在 SQLCODE 中。我该如何处理这里真正的异常?
非常感谢。
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于处理并行查询服务器返回的异常的主要内容,如果未能解决你的问题,请参考以下文章
Android Retrofit+RxJava 优雅的处理服务器返回异常错误