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;