达梦数据库存储过程循环报错后继续下一个循环不终止

  • Post author:
  • Post category:其他




1、创建存储过程

1.1、创建一个存储过程将一个模式对应的表插入其它表中。

CREATE OR REPLACE
PROCEDURE T_1208
        (
        )
AS
        I INT                                                                   :=0;
        CURSOR Z FOR SELECT OWNER, OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE='TABLE' AND OWNER='OA_02_TEST';
        BEGIN
                FOR D IN Z
                LOOP
                        I=I+1;
                        PRINT I;
                        EXECUTE IMMEDIATE 'INSERT INTO '|| D.OWNER ||'.'||D.OBJECT_NAME ||' SELECT * FROM SYSDBA.'||D.OBJECT_NAME;
                END LOOP;
        EXCEPTION
        WHEN OTHERS THEN
                PRINT SQLERRM;
        END;

1.2、测试执行

[执行语句1]:
CALL T_1208();
执行成功, 执行耗时2毫秒. 执行号:4174
1
2
列表不匹配


2、修改存储过程

2.1、将循环体内添加exception。

CREATE OR REPLACE
PROCEDURE T_1208
        (
        )
AS
        I INT                                                                   :=0;
        CURSOR Z FOR SELECT OWNER, OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE='TABLE' AND OWNER='OA_02_TEST';
        BEGIN
                FOR D IN Z
                LOOP
                
                BEGIN   --开始
                        I=I+1;
                        PRINT I;
                        EXECUTE IMMEDIATE 'INSERT INTO '|| D.OWNER ||'.'||D.OBJECT_NAME ||' SELECT * FROM SYSDBA.'||D.OBJECT_NAME;
                EXCEPTION   --捕获错误
                WHEN OTHERS THEN
                PRINT SQLERRM;
                END;              --结束
             END LOOP;
        EXCEPTION
        WHEN OTHERS THEN
                PRINT SQLERRM;
        END;

说明:将捕获报错放在循环里面,代码段中的注释的那段BEGIN … EXCEPTION … END。这样我们报错就不会终止循环但是错误也能在消息提示。

2.2、执行结果

[执行语句1]:
CALL T_1208();
执行成功, 执行耗时2毫秒. 执行号:4176
1
2
列表不匹配
3
列表不匹配

说明:遇到第一个报错后没有退出存储过程而是继续循环执行。

链接:

达梦技术社区https://eco.dameng.com/

.



版权声明:本文为a406716524原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。