暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 具有多表插入并指定保存异常的FORALL

askTom 2017-06-08
277

问题描述

嗨,汤姆,您没有在几年前我参加的都柏林会议上报道这一点!

作为ETL过程的一部分,我正在执行一个数组,指定保存异常,并使用多表插入作为我的FORALL DML语句。

这一切都很好,我把我的错误写入日志表中,从SQL % bulk_exception收集信息。

我想在我的日志表中记录的是我在引发异常时插入的表的名称。

这可能吗?我可以通过分析日志来解决这个问题 (例如,我的insert中只有一个表具有唯一的约束),但是我想以编程方式确定。

我在SQL % BULK_EXCEPTIONS中没有看到任何元素会给我我想要的东西。

非常感谢,
罗伯

专家解答

不是我知道的,没有。你可以将sql % bulk_exceptions.error_code传递给sqlerrm。但不幸的是,该消息被剥夺了有用的信息,这将有助于您识别表:

create table teddies (
  colour varchar2(10), 
  price  number
);
create table bricks (
  colour varchar2(5), 
  price  number
);

set serveroutput on
declare
  type tab_arr is table of teddies%rowtype index by pls_integer;
  rws  tab_arr;
  
  forall_err exception;
  pragma exception_init(forall_err, -24381);
begin
  rws(1).colour := 'blue';
  rws(1).price  := 10.99;
  rws(2).colour := 'yellow';
  rws(2).price  := 2.99;

  forall i in 1 .. rws.count save exceptions
    insert all
      into bricks values (rws(i).colour, rws(i).price)
      into teddies values (rws(i).colour, rws(i).price)
    select * from dual;

exception 
  when forall_err then 
    for errs in 1 .. sql%bulk_exceptions.count loop
      dbms_output.put_line(sqlerrm(-sql%bulk_exceptions(errs).error_code));
    end loop;
    raise;
end;
/

ORA-12899: value too large for column  (actual: , maximum: )

select * from bricks;

COLOUR  PRICE  
blue    10.99  

select * from teddies;

COLOUR  PRICE  
blue    10.99 
复制


如果这是一个问题,您最好还是坚持使用单表插入。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论