2

使用以下触发器时出现错误:

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”时出错

4

2 回答 2

4

数据库错误消息

ORA-06519:检测到主动自主事务并回滚
原因:在从自主PL/SQL块返回之前,必须完成块内启动的所有自主事务(提交或回滚)。如果不是,则活动的自治事务将隐式回滚并引发此错误。
行动:确保在从自治 PL/SQL 块返回之前,任何活动的自治事务都明确提交或回滚。

来自数据库 PL/SQL 语言参考的示例

-- 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 用他的帖子解决的问题。

于 2016-01-17T15:19:48.793 回答
1

如果触发器不使用:newor :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_idstud_standard_id
于 2016-01-17T13:09:42.210 回答