2016-01-17 2 views
2

Я получаю сообщение об ошибке при работе со следующим триггером:пл Ошибка 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; 

enter image description here

ошибка

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

+0

Удалены теги 'Sql server' и' Mysql', так как в сообщении об ошибке четко указано, что это 'ORACLE' –

+0

Пробовал ли вы искать сообщение об ошибке« Активная автономная транзакция, обнаруженная и откатная »в поисковой системе? Мой первый хит, кажется, объясняет это очень детально. – DIDoS

+0

Ther - это руководство по описанию оракула [Database Error Messages] (http://docs.oracle.com/database/121/ERRMG/toc.htm), объясняющее причину возникновения этой ошибки и способы ее устранения. – miracle173

ответ

1

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

ничего в этом ответе не решит проблему. Вы запускаете также и ту же ошибку. – miracle173

+0

@ miracle173. , , Этот код должен предотвращать ошибку с изменением таблицы, что является вероятной причиной сбоя. Этот код больше не ссылается на изменяемую таблицу. Как вы думаете, почему это не решает проблему? –

+1

, потому что проблема заключается в автономной транзакции, которая не совершена и не откатна – miracle173

4

Database Error Messages

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

Пример из Database 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 уже заявил, что автономная транзакция может быть, это не уместно.

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

Смежные вопросы