Oracle存储过程抛出自定义异常后循环终止问题求助
问题解决方法
问题根源
你当前的异常捕获块包裹了整个表遍历循环,只要任意一个表处理时抛出-20100错误,整个循环块会直接终止,跳转到异常处理逻辑,剩余的表就不会继续处理了。
修改方案
将异常捕获的嵌套块移动到循环内部,仅包裹单表的处理逻辑,这样单表异常只会中断当前表的处理,不会影响后续循环执行。
修改后的代码(对应原存储过程的表创建循环部分)
-- 原嵌套块外层的代码无需改动,仅替换循环部分即可 FOR CurrentRow IN TablesSelected LOOP -- 单表处理的嵌套块,异常仅作用于当前表 DECLARE INVALID_COLUMN_EXCEPTION EXCEPTION; PRAGMA EXCEPTION_INIT(INVALID_COLUMN_EXCEPTION, -20100); BEGIN wLengthOfStatement := LENGTH('CREATE TABLE' || CurrentRow.Table_Name || ' ' || '); -- '); wLeftPadTableName := LPAD('); -- ', wLengthOfStatement, ' '); DBMS_OUTPUT.PUT_LINE( '-- Start extracting table ' || CurrentRow.Table_Name); DBMS_OUTPUT.PUT_LINE('CREATE TABLE ' || CurrentRow.Table_Name || '( '); Extract_Columns(CurrentRow.Table_Name); DBMS_OUTPUT.PUT_LINE(wLeftPadTableName || 'END of table ' || CurrentRow.Table_Name || ' creation'); DBMS_OUTPUT.PUT_LINE( '--' ); DBMS_OUTPUT.PUT_LINE( '--' ); EXCEPTION WHEN INVALID_COLUMN_EXCEPTION THEN DBMS_OUTPUT.PUT_LINE('================================================================================'); DBMS_OUTPUT.PUT_LINE('== EXCEPTION ' || SQLCODE || ' Raised - ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('== Unable to complete table generation for ' || CurrentRow.Table_Name); DBMS_OUTPUT.PUT_LINE('================================================================================'); END; END LOOP;
效果说明
- 单个表存在不支持的字段类型时,仅会打印该表的异常信息,不会终止整个存储过程
- 其余正常的表仍然会完整输出建表语句
- 最终的完成提示也会正常打印
内容的提问来源于stack exchange,提问作者Adachi
相关产品推荐
相关产品推荐

