【发布时间】:2017-10-08 07:59:48
【问题描述】:
我有一个过程,它接受 2 个关联数组的输入,经过一些基本计数检查后,执行 FORALL 语句将数据插入到表中。
程序如下:
PROCEDURE INSERT_RECS(P_PROD_TYP IN prod_type, P_PROD_ADD_PK IN prod_pk_type)
IS
uniq_key EXCEPTION;
PRAGMA EXCEPTION_INIT(uniq_key, -00001);
loc_cnt NUMBER;
BEGIN
IF P_PROD_TYP.COUNT = P_PROD_ADD_PK.COUNT THEN
FORALL i IN P_PROD_TYP.FIRST .. P_PROD_TYP.LAST
INSERT INTO product_table ( pk,
id,
created_by,
created_on,
last_chg_by,
last_chg_on)
VALUES (P_PROD_ADD_PK(i),
P_PROD_TYP(i).id,
P_PROD_TYP(i).created_by,
P_PROD_TYP(i).created_on,
NULL,
NULL);
END IF;
EXCEPTION
WHEN uniq_key THEN
loc_cnt := SQL%BULK_EXCEPTIONS.count;
FOR i IN 1 .. loc_cnt LOOP
dbms_output.put_line('EXCEPTION: Array Index: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
' Message: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE) ||
' SQLERRM: ' || SQLERRM ||
' SQLCODE: ' || SQLCODE ||
' stack: ' || SYS.dbms_utility.format_call_stack);
END LOOP;
RETURN;
END;
我想要的是,如果我遇到异常,有没有办法可以查看导致问题的记录,基本上是关联数组中的索引,或者至少让 SQL% 信息有信息.
我看过以下内容: http://www.dba-oracle.com/plsql/t_plsql_exceptions.htm
但这会输出有关该列的信息,但这不是我想要的。
【问题讨论】:
-
既然你有索引 (SQL%BULK_EXCEPTIONS(i).error_index ),为什么不直接遍历 p_prod_typ 直到找到导致错误的记录的索引?
标签: oracle exception plsql associative-array