Oracle中带有BULK_EXCEPTIONS的真实错误文本



在使用时,是否可以知道真正的原因,真正的ora代码(在这种情况下是唯一密钥冲突(

FORALL var_i_idx IN 1..table_of_t.count SAVE EXCEPTIONS
INSERT INTO TABLE_A VALUES (                          
table_of_t(var_i_idx).var_id);
RETURN retVal;
EXCEPTION
WHEN OTHERS
THEN
IF SQLCODE = -24381
THEN
FOR var_i_idx IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
LOOP
v_action := 'Insert table_of_t';
v_error_text := 'Unexcpected exception SQLCODE: ' || SQL%BULK_EXCEPTIONS (var_i_idx).ERROR_INDEX || ' -- ERROR:' || sqlerrm(SQL%BULK_EXCEPTIONS (var_i_idx).ERROR_CODE);
dbms_output.put_line('Unexcpected exception SQLCODE: '||SQLCODE||' -- ERROR: '||SQLERRM);

DBMS将打印以下内容:异常SQLCODE:-24381--错误:ORA-24381:数组DML 中的错误

但有可能知道真正的原因吗?

是的,您可以获得实际的错误消息,尽管只有基本消息。问题是您的dbms_output消息是针对批量错误而不是单个项目错误的。您可以从SQL%BULK_EXCEPTIONS集合中的error_CODE中获取项错误。您甚至可以通过ERROR_INDEX访问导致异常的实际数据。这将对forall语句中命名的集合中的条目进行索引。错误消息和大容量集合的骨架访问(其中blk_array是forall中使用的集合的名称(。见小提琴;

for err_idx in 1 .. sql%bulk_exceptions
loop     
msg := sqlerrm(-sql%bulk_exceptions(err_idx).error_code);   
val := blk_array(sql%bulk_exceptions(err_idx).error_index);
end loop; 

在fiddle中忽略设置FORALL的代码,FORALL完全可用于另一项任务。只需专注于异常部分,除了以下几行:

declare
errors_during_forall exception;                       -- create name for errors during bulk, forall, processing
pragma exception_init (errors_during_forall, -24381); -- and tie that name to the actual Oracle error number

这允许您为异常定义一个名称,然后引用该名称,即exception部分。

相关内容

最新更新