DECLARE
ERROR_COUNT NUMBER;
errno number;
e_msg varchar2(50);
e_idx varchar2(20);
TYPE emp_type IS TABLE OF emp_source%ROWTYPE;
EMP_VAR emp_type;
CURSOR c1 IS SELECT * FROM emp_source;
BEGIN
OPEN c1;
loop
FETCH c1 BULK COLLECT INTO EMP_VAR;
BEGIN
FORALL i in 1 .. EMP_VAR.COUNT save exceptions
insert INTO emp_target (e_id,e_name,sal) values (EMP_VAR(i).E_ID,EMP_VAR(i).E_NAME,EMP_VAR(i).SAL);
FORALL i in 1 .. EMP_VAR.COUNT save exceptions
insert INTO department_target (dep_name) values (EMP_VAR(i).dep_name);
EXCEPTION
WHEN others THEN
ERROR_COUNT := sql%bulk_exceptions.count;
for i in 1 .. ERROR_COUNT
loop
errno := sql%bulk_exceptions(i).error_code;
e_msg := sqlerrm(-errno);
e_idx := sql%bulk_exceptions(i).error_index;
insert into emp_save_exc values(errno,e_msg,e_idx);
end loop;
END;
exit when c1%notfound;
end loop;
close c1;
commit;
END;
-3
A
回答
2
你可以把周围的第一FORALL一个BEGIN/END块和处理这样的例外:
BEGIN
FORALL i in 1 .. EMP_VAR.COUNT save exceptions
insert INTO emp_target (e_id,e_name,sal) values (EMP_VAR(i).E_ID,EMP_VAR(i).E_NAME,EMP_VAR(i).SAL);
EXCEPTION
WHEN ...
END;
你也可以把每个块成一个程序,让你的代码更有条理:
DECLARE
...
PROCEDURE insert_emp_target (p_emp_var emp_type) IS
BEGIN
FORALL i in 1 .. EMP_VAR.COUNT save exceptions
insert INTO emp_target (e_id,e_name,sal)
values (EMP_VAR(i).E_ID,EMP_VAR(i).E_NAME,EMP_VAR(i).SAL);
EXCEPTION
WHEN ...
END;
PROCEDURE insert_dept_target (p_emp_var emp_type) IS
...
BEGIN
OPEN c1;
loop
FETCH c1 BULK COLLECT INTO EMP_VAR;
exit when c1%notfound;
insert_emp_target (emp_var);
insert_dept_target (emp_var);
...
end loop;
close c1;
commit;
END;
相关问题
- 1. 第二个最后记录
- 2. 发生异常时要记录什么?
- 3. 当发生异常时记录什么
- 4. Mongoid - 如何获得第二个记录?
- 5. 从第二列记录中替换第一列记录
- 6. 如何获得第一个记录和最后一个记录
- 7. 只选择第二个记录
- 8. 倒数第二个记录SQL查询
- 9. 记录第二个键盘事件
- 10. 为什么不会执行第二个scanf()执行
- 11. 记录集中的第一条记录为空。为什么?
- 12. 选择第一个记录每个组
- 13. 哪一个最好:首先记录然后执行操作或首先执行操作然后记录它?
- 14. 如果第一个参数不是类,issubclass会引发异常
- 15. 如何两次订购相同的记录集,第二个订单独立于第一个订单执行?
- 16. Django Template For Loop:您如何为第一条记录执行操作?
- 17. ,执行一个块并忽略但记录异常
- 18. C#IEnumerable检索第一个记录
- 19. CSV只取第一个记录
- 20. String只记录第一个字
- 21. 删除第一个插入的记录
- 22. 更改第一个选择记录
- 23. Plone 4 - 第二个工作流的历史记录不会显示在@@ historyview中
- 24. CATCH块不会第一次执行,而是第二次执行 - 为什么?
- 25. PHP第二个标记不起作用,什么错了?
- 26. 插入排除第二个,添加现有记录中的第一个
- 27. 水晶 - 如何指定一个特定的记录值(通常是第一个)当有多个记录
- 28. 异常记录
- 29. 异常记录
- 30. MySQL从第一个和第n个记录获取时间差异
请参阅http://stackoverflow.com/help/how-to-ask。我试着想象一下,如果一位同事来到我的办公桌上面打印出来并说出标题中的字眼,我会怎么做。我的回应可能会很短暂而且有点尖锐。 – BriteSponge