Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 forall save exceptions  [new]
Bukan
Member

Откуда: Краснодар
Сообщений: 31
Добрый день.
Ситуация следующая:
Есть вьюха на таблицу. На вьюхе висят триггеры, которые проверяют бизнес-правило и добавляют данные в таблицу, если происходит insert. Если бизнес-правило нарушается, то срабатывает исключение и в таблицу данные не вносятся.
При помощи конструкции forall save exceptions вставляю данные во вьюху из коллекции. По идее Oracle должен занести все строки, которые прошли проверку бизнес-логики. А те которые не прошли можно отловить в блоке исключений.
Проблема в том, что этого не происходит. Он заносит данные в таблицу ровно до той строки, на которой бизнес-правило не выполняется и на триггере вызывается исключение.
Более того, если в блоке исключений отлавливать ошибку -24381, то Oracle тупо добавляет данные и всё.

Кто-нибудь сталкивался с чем-то подобным? Может быть дело в триггерах на вьюху и пользовательских исключениях?
15 окт 13, 16:36    [14974375]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1635
Как альтернативный способ - insert error_logging_clause.
15 окт 13, 16:50    [14974488]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
Bukan
Member

Откуда: Краснодар
Сообщений: 31
dmdmdm,
Пробовал. Ругается на INSTEAD OF триггер.
15 окт 13, 17:02    [14974569]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
Corner
Member

Откуда:
Сообщений: 1270
Bukan
то срабатывает исключение

вот отсюда поподробнее.
15 окт 13, 17:09    [14974647]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
примерный
Guest
Bukan,

Больше примеров и кода в тред! Показывайте, как написано и где не работает.
15 окт 13, 17:13    [14974678]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
Bukan
Member

Откуда: Краснодар
Сообщений: 31
Corner
Bukan
то срабатывает исключение

вот отсюда поподробнее.

То есть если правило нарушается, то идёт команда raise_application_error и транзакция откатывается.
16 окт 13, 07:34    [14977790]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
Bukan
Member

Откуда: Краснодар
Сообщений: 31
примерный
Bukan,

Больше примеров и кода в тред! Показывайте, как написано и где не работает.


На триггера проверка вида:
for cur in (выборка)
loop
  raise_application_error (-20999, 'Ошибка!');
end loop;

То есть ли выборка выдаёт значения, то считается, что это ошибка.

Делаю insert вот таким образом:
begin
  forall cur in 1 .. collection.count save exception
  insert into table 
  values (collection(cur).col1);
exception when others then
  if sqlcode = -24381 then
    /* запись в лог */
  end if;
end;


То есть он заходит в блок исключений, но ошибку -24381 не определяет.
16 окт 13, 07:59    [14977809]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
-2-
Member

Откуда:
Сообщений: 15330
Bukan,

Может и есть баг с пользовательскими исключениями или с триггером на view, сделай обычный цикл. С таким нагромождением plsql промеж sql смысла в forall все равно нет.
16 окт 13, 08:36    [14977848]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
Bukan
Member

Откуда: Краснодар
Сообщений: 31
-2-
Bukan,

Может и есть баг с пользовательскими исключениями или с триггером на view, сделай обычный цикл. С таким нагромождением plsql промеж sql смысла в forall все равно нет.


Пока так и делаю.
16 окт 13, 08:41    [14977856]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
jan2ary
Member

Откуда: Киев
Сообщений: 1780
Bukan,

Handling FORALL Exceptions After FORALL Statement Completes

SQL> drop table t6 purge;

Table dropped.

SQL> create table t6 (
  2    id number
  3  );

Table created.

SQL> set serveroutput on
SQL> create or replace trigger t6_id_check
  2  before insert on t6
  3  for each row
  4  begin
  5    if(:new.id > 10)
  6    then
  7      raise_application_error(-20099, 'Go ahead you bastard!');
  8    end if;
  9  end;
 10  /

Trigger created.

SQL> declare
  2    type lst is varray(20) of number;
  3    vals lst := lst(1,2,3,11,12,13);
  4  begin
  5    forall i in vals.first .. vals.last save exceptions
  6    insert into t6
  7    values ( vals(i) );
  8  exception when others then
  9    if sqlcode = -24381 then
 10      dbms_output.put_line('Gotcha!'); -- один раз все же вызывается
 11    end if;
 12  end;
 13  /
Gotcha!

PL/SQL procedure successfully completed.

SQL> declare
  2    bad_stmt_idx number;
  3    bad_val number;
  4    type lst is varray(20) of number;
  5    vals lst := lst(1,2,3,11,12,13);
  6    dml_errors  exception;
  7    pragma exception_init(dml_errors, -24381);
  8  begin
  9    forall i in vals.first .. vals.last save exceptions
 10    insert into t6
 11    values ( vals(i) );
 12  exception when dml_errors then
 13    for e in 1..sql%bulk_exceptions.count
 14    loop
 15      bad_stmt_idx := sql%bulk_exceptions(e).error_index ;
 16      bad_val := vals(bad_stmt_idx);
 17      dbms_output.put_line(bad_stmt_idx || ': ' || bad_val || ': Gotcha!');
 18    end loop;
 19  end;
 20  /
4: 11: Gotcha!
5: 12: Gotcha!
6: 13: Gotcha!

PL/SQL procedure successfully completed.

SQL>
16 окт 13, 10:40    [14978372]     Ответить | Цитировать Сообщить модератору
 Re: forall save exceptions  [new]
Невероятный Bulk
Guest
BULK INSERT into View w/ Instead Of Trigger - DML ERROR LOGGING Issue

На mos по поиску BULK_EXCEPTIONS там и не такое
Именно со вьюхой и триггером не нашел, но есть на таблицу с after insert, хотя воспроизвести не получилось...

В общем-то, какая бы версия у тебя ни была - крепись...
16 окт 13, 10:54    [14978464]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить