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
выглядит подозрительно Я бы посоветовал вам назвать внешние ключи после первичного ключа, на который они ссылаются.