You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:45:03