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
列表不匹配
说明:遇到第一个报错后没有退出存储过程而是继续循环执行。
版权声明:本文为a406716524原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。