Oracle Database Express 10g中是否提供复合触发器?

时间:2017-06-26 03:07:19

标签: oracle plsql database-trigger

我想编写一个Trigger来验证一个列是否只有一个特定值,如果某个用户尝试更新或插入一个具有相同值的行,则会触发该触发器。但触发器编译不好。你有什么主意吗?你知道化合物触发器是否在10g中可用吗?

注意:mon_oficial列只有一个“S”值可用。如果某些用户尝试插入新记录或使用第二个“S”值更新,则会触发触发器。

表:

enter image description here

触发:

CREATE OR REPLACE TRIGGER check_mon_oficial_trg
FOR INSERT OR UPDATE
ON monedas
COMPOUND TRIGGER
  v_check_moneda NUMBER(8);
BEFORE STATEMENT IS
  BEGIN
    SELECT COUNT(:NEW.mon_oficial)
    INTO   v_check_moneda
    FROM   monedas
    WHERE  mon_oficial = 'S';

    IF
      v_check_moneda > 1 THEN
        RAISE_APPLICATION_ERROR(-20010, 'Only one official money in table');
    END IF;
  END BEFORE STATEMENT;
END check_mon_oficial_trg;

错误:

enter image description here

1 个答案:

答案 0 :(得分:2)

复合触发器在11gR1

中引入

复合触发

复合触发器是一种数据库操作语言(DML)触发器,可以在多个时间点触发。

复合触发器的主体支持其所有部分的代码都可以访问的公共PL / SQL状态。当触发语句启动时会建立公共状态,并在触发语句完成时销毁,即使触发语句导致错误。

在版本11.1之前,应用程序开发人员使用辅助包对公共状态进行建模。当触发语句导致错误并且语句后触发器没有触发时,这种方法编程既麻烦又容易出现内存泄漏。复合触发器可以更轻松地编写一种方法,您希望为各种时序点实现的操作共享公共数据。