Oracle 如何在forall plsql中捕获错误

Oracle 如何在forall plsql中捕获错误,oracle,plsql,Oracle,Plsql,我设置此异常是为了避免插入某些行时出错,但我不知道为什么可以运行 DECLARE TYPE dataDate IS TABLE OF DATE; l_dataDate dataDate; BEGIN select data1 BULK COLLECT INTO l_dataDate from USER.TABLE_DATA; FORALL i IN l_dataDate.FIRST..l_dataDate.LAST BEGIN INSERT INTO U

我设置此异常是为了避免插入某些行时出错,但我不知道为什么可以运行

DECLARE
TYPE dataDate IS TABLE OF DATE;
l_dataDate dataDate;
BEGIN
select data1 BULK COLLECT INTO l_dataDate from USER.TABLE_DATA;
FORALL i IN l_dataDate.FIRST..l_dataDate.LAST
    BEGIN         
        INSERT INTO USER.DIMDATE SELECT
        to_number(to_char(l_dataDate(i), 'YYYYMMDDHH24MISS')),
        to_number(to_char(l_dataDate(i), 'YYYYMMDD')),
        l_dataDate(i),
        to_number(to_char(l_dataDate(i), 'DD')),
        to_char (l_dataDate(i), 'Day'),
        to_number(to_char (l_dataDate(i), 'MM')),
        to_char (l_dataDate(i), 'Month'),
        to_number(to_char(l_dataDate(i), 'YYYY')) FROM DUAL
        WHERE NOT EXISTS (SELECT 1 FROM USER.DIMDATE WHERE COD_FECHA=to_number(to_char(l_dataDate(i), 'YYYYMMDDHH24MISS'))); 
        COMMIT;
    EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line('ERROR '||SUBSTR(SQLERRM, 1, 200));
    END;
END;
/

有可能做这样的事吗?提前感谢。

我假设您希望在批量收集中保存异常


但是,对于这样的情况,似乎根本没有理由使用PL/SQL。如果表数据中有需要记录的无效数据,只需编写一条INSERT语句,可能会记录DML错误。

我假设您希望在批量收集中保存异常


但是,对于这样的情况,似乎根本没有理由使用PL/SQL。如果表数据中有需要记录的无效数据,只需编写一条INSERT语句,可能会记录DML错误。

我假设您要进行大容量收集。。。保存异常。我假设你想做一个批量收集。。。保存异常。非常感谢,但是如果例如在第二次插入中出现错误,其他行将不会插入,因为foral语句中没有异常。@Igerras84-您实际测试过它吗?保存异常保存异常。如果集合的第二个元素生成错误,则forall将继续。然后,它将在外部异常处理程序中报告,您可以遍历sql%bulk_exceptions集合以获取有关错误的信息。这与使用for循环时发生的情况不同,在for循环中,必须在循环迭代中处理异常。非常感谢,但是如果例如在第二次插入中出现错误,其他行将不会插入,因为该异常不在foral语句中。@Igerras84-您实际测试过它吗?保存异常保存异常。如果集合的第二个元素生成错误,则forall将继续。然后,它将在外部异常处理程序中报告,您可以遍历sql%bulk_exceptions集合以获取有关错误的信息。这与使用for循环时的情况不同,在for循环中,必须在循环迭代中处理异常。
DECLARE
  TYPE dataDate IS TABLE OF DATE;
  l_dataDate dataDate;

  dml_errors EXCEPTION;
  PRAGMA exception_init(dml_errors, -24381);
BEGIN
  select data1 
    BULK COLLECT INTO l_dataDate 
    from USER.TABLE_DATA;

BEGIN
  FORALL i IN l_dataDate.FIRST..l_dataDate.LAST SAVE EXCEPTIONS
    INSERT INTO USER.DIMDATE 
      SELECT
          to_number(to_char(l_dataDate(i), 'YYYYMMDDHH24MISS')),
          to_number(to_char(l_dataDate(i), 'YYYYMMDD')),
          l_dataDate(i),
          to_number(to_char(l_dataDate(i), 'DD')),
          to_char (l_dataDate(i), 'Day'),
          to_number(to_char (l_dataDate(i), 'MM')),
          to_char (l_dataDate(i), 'Month'),
          to_number(to_char(l_dataDate(i), 'YYYY'))  
     FROM DUAL
    WHERE NOT EXISTS (SELECT 1 
                        FROM USER.DIMDATE 
                       WHERE COD_FECHA=to_number(
                                         to_char(l_dataDate(i), 
                                                 'YYYYMMDDHH24MISS'))); 
EXCEPTION 
  WHEN dml_errors
  THEN
    FOR i IN 1..sql%bulk_exceptions.count
    LOOP
      <<do something with the exceptions>>
    END LOOP;
END;