更新后的Oracle触发器无法正常执行

时间:2012-12-04 16:50:06

标签: oracle plsql triggers

我有两个表,tblapplication和tblapplicationhistory。 tblapplicationhistory是对应用程序表中应用程序状态所做的每个更改的归档。应用程序表中的学生可以有很多应用程序。

当应用程序状态变为“Offer accepted”时,状态ID将设置为7.然后,这将反映在application和applicationhistory表中。此时,给定学生的所有其他申请状态应设置为8,“提议被拒绝”。

create or replace
TRIGGER trg_declineapplications AFTER UPDATE ON tblapplicationhistory FOR EACH ROW

BEGIN
   IF :NEW.statusid_fk_nn = 7 THEN
      UPDATE tblapplication
      SET statusid_fk_nn = 8
      WHERE studentrecordnumber_fk_nn = ( SELECT studentrecordnumber_fk_nn
                                          FROM tblapplication
                                          WHERE applicationid_pk_nn = :NEW.applicationid_fk_nn
                                        )
      AND applicationid_pk_nn != :NEW.applicationid_fk_nn;
   END IF;
END;

触发器编译时没有错误,触发器激活而不返回任何SQL错误,但不对应用程序表中的任何行执行计算。在这种情况下,触发器的逻辑必定存在错误,但我没有看到它。

在我看来,如果tblapplicationhistory中更新的行包含statusID 7,则会对应用程序表执行更新,将属于同一学生的所有应用程序的statusID设置为8,而不是接受的应用程序。

如果需要,可以提供更多信息。

表定义:

tblapplication:
applicationid_pk_nn
studentrecordnumber_fk_nn
jobid_fk_nn
statusid_fk_nn

tblapplicationhistory:
applicationid_fk_nn
statusid_fk_nn
datechanged_nn
applicationhistoryid_pk_nn

在tblapplication中,主键是applicationid_pk_nn,所有其他字段都是外键。

在tblapplicationhistory中,applicationhistoryid_pk_nn是主键。从applicationid_fk_nn的tblapplication中恢复statusid_fk_nn。

1 个答案:

答案 0 :(得分:1)

触发方法看起来不太健壮。

当您更新记录以设置接受/拒绝的应用程序时,您可以执行以下操作:

 update my_table
 set    status_id = case my_table.application_id
                      when application_id_for_accepted_offer then 7
                      else 8
                    end
 where  student_id = student_id_to_update;