pl sql ошибка при работе с триггером

Я получаю сообщение об ошибке при работе со следующим триггером:

create or replace trigger t1
  after insert or update  
     on student_tbl 
  declare
   pragma autonomous_transaction;
    begin
   if inserting then

 insert into stud_fees_details(stud_id,fees_balance,total_fees) 
       select stud_id,course_fees,course_fees from student_tbl s,courses_tbl c where s.stud_standard_id=c.course_id;

 elsif updating('stud_standard_id') then

insert into stud_fees_details(stud_id,fees_balance,total_fees) 
select stud_id,course_fees,course_fees from student_tbl s,courses_tbl c where s.stud_standard_id=c.course_id;

 end if;
end;

введите описание изображения здесь

ошибка

ORA-06519: активная автономная транзакция обнаружена и откатана ORA-06512: в "SYSTEM.T1", строка 15 ORA-04088: ошибка во время выполнения триггера "SYSTEM.T1"

2 ответа

Сообщения об ошибках базы данных

ORA-06519: активная автономная транзакция обнаружена и откатана
Причина. Перед возвратом из автономного блока PL/SQL все автономные транзакции, запущенные в этом блоке, должны быть завершены (зафиксированы или откатаны). Если нет, активная автономная транзакция неявно откатывается, и возникает эта ошибка.
Действие: Убедитесь, что перед возвратом из автономного блока PL/SQL все активные автономные транзакции явно зафиксированы или откатаны.

Пример из базы данных PL/SQL Language Reference

-- Autonomous trigger on emp table:

CREATE OR REPLACE TRIGGER log_sal
  BEFORE UPDATE OF salary ON emp FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO log (
    log_id,
    up_date,
    new_sal,
    old_sal
  )
  VALUES (
    :old.employee_id,
    SYSDATE,
    :new.salary,
    :old.salary
  );
  COMMIT;
END;
/

Но @a_horse_with_no_name уже заявил, что автономная транзакция, возможно, здесь не подходит.

После удаления прагмы об автономной транзакции вы, возможно, столкнетесь с проблемой, о которой @GordonLinoff решает в своем посте.

Если триггер не использует :new или же :old, то это подозрительно. Ваш триггер использует ту же таблицу, которая изменяется в запросах.

Вы, вероятно, намереваетесь:

create or replace trigger t1 after insert or update on student_tbl 
declare
   pragma autonomous_transaction;
begin
    if inserting then
        insert into stud_fees_details(stud_id, fees_balance, total_fees) 
            select stud_id, course_fees, course_fees
            from courses_tbl c
            where c.course_id = :new.stud_standard_id;

    elsif updating('stud_standard_id') then
        insert into stud_fees_details(stud_id, fees_balance, total_fees) 
            select stud_id, course_fees, course_fees
            from courses_tbl c
            where c.course_id = :new.stud_standard_id;
    end if;
    commit;
end;

Заметки:

  • select операторы должны иметь псевдонимы таблиц, чтобы различать столбцы :new и из courses_tbl,
  • Два пункта к if выглядите одинаково для меня, поэтому я не понимаю логику.
  • join условия между тем, что называется course_id и что-то называется stud_standard_id выглядит подозрительно Я бы посоветовал вам назвать внешние ключи после первичного ключа, на который они ссылаются.
Другие вопросы по тегам