我有以下代码结构
PROCEDURE ..
PRAGMA EXCEPTION_INIT(dml_errors, -24381);
l_errors NUMBER;
BEGIN
-- busines logic
FORALL TABLE_1 do delete;
FORALL TABLE_1 do update;
FORALL TABLE_1 do insert;
FORALL TABLE_2 do insert;
FORALL TABLE_2 do update;
FORALL TABLE_2 do insert;
EXCEPTION
WHEN dml_errors then
--extract error indexes
END;
每个forall循环处理一个单独的数组表,即从table_1中删除的循环将通过pls_integer处理table_1_u索引表;
每个forall循环都有保存例外关键字
现在,我如何提取哪个“for”失败并且“该索引中的哪个记录失败”。
答案 0 :(得分:3)
我如何提取哪个“for”失败
使用调用堆栈(FORMAT_ERROR_BACKTRACE) 或者通过实施某些步骤:
PROCEDURE ..
PRAGMA EXCEPTION_INIT(dml_errors, -24381);
l_errors NUMBER;
iStep NUMBER;
BEGIN
-- busines logic
iStep := 0;
FORALL TABLE_1 do delete;
iStep := 1;
FORALL TABLE_1 do update;
iStep := 2;
FORALL TABLE_1 do insert;
iStep := 3;
FORALL TABLE_2 do insert;
iStep := 4;
FORALL TABLE_2 do update;
iStep := 5;
FORALL TABLE_2 do insert;
EXCEPTION
WHEN dml_errors then
IF iStep = 0 THEN
ELSIF...
END;
END;
该索引中的哪条记录失败
使用bulk_exceptions光标:
PROCEDURE ..
PRAGMA EXCEPTION_INIT(dml_errors, -24381);
l_errors NUMBER;
iStep NUMBER;
BEGIN
-- busines logic
iStep := 0;
FORALL TABLE_1 do delete;
iStep := 1;
FORALL TABLE_1 do update;
iStep := 2;
FORALL TABLE_1 do insert;
iStep := 3;
FORALL TABLE_2 do insert;
iStep := 4;
FORALL TABLE_2 do update;
iStep := 5;
FORALL TABLE_2 do insert;
EXCEPTION
WHEN dml_errors then
FOR i IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('Error #' || i || ' occurred during '||
'iteration #' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);
DBMS_OUTPUT.PUT_LINE('Error message is ' ||
SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
END LOOP;
IF iStep = 0 THEN
ELSIF...
END;
END;