触发器

来源:互联网 发布:c语言休眠函数 编辑:程序博客网 时间:2024/04/29 21:59

在ORCLE系统中,每个触发器被DML操作触发时,会产生两个特殊的变量:OLD和:NEW,分别代表某数据记录行在修改前和修改后的值。这两个变量都是系统变量,由Oracle系统管理,存储在内存中,不允许用户直接对其进行修改。:OLD和:NEW变量的结构总是与执行DML操作的表的结构相同。当触发器工作完成以后,这两个变量也随之消失。这两个变量是只读的,即用户不能向这两个变量写入内容,但可以引用变量中的数据。

:OLD变量用于存储DELETE和UPDATE操作所影响的行的副本。当执行DELETE或UPDATE操作时,行从触发表中被删除,并传输到:OLD变量中。

:NEW变量用于存储INSERT和UPDATE操作所影响的行的副本。当执行INSERT或UPDATE操作时,新行被同时添加到:NEW变量和触发表中,:NEW变量中的行即为触发表中的新行的副本。

插入型触发器

在产品表PRODUCT中插入数据记录时需要进行如下检查:当试图往PRODUCT表中插入在产品类别表CATEGORY中并不存在的产品类别编号CATEGORYID时,返回一条表示错误的消息;否则显示表示正确的消息。

CREATE OR REPLACE TRIGGER TRG_ADDPRODUCT

BEFORE INSERT

ON PRODUCT

FOR EACH ROW

DECLARE

    counter INTEGER;

BEGIN

     SELECT COUNT(*) INTO counter

     FROM CATEGORY

    WHERE CATEGORYID=:NEW.CATEGORYID;

    IF counter>0 THEN

        DBMS_OUTPUT.PUT_LINE('添加新产品成功');

    ELSE

        DBMS_OUTPUT.PUT_LINE('产品编号'|| :NEW.CATEGORYID||'在产品类别表CATEGORY中不存在');

    END IF

END TRG_ADDPRODUCT;

删除型触发器

当需要删除订单表ORDERS的数据记录时,需要同时删除订单明细表ORDERDETAILS的相关数据记录,并显示相应的消息

CREATE OR REPLACE TRIGGER TRG_DELETEORDER

AFTER DELETE

ON ORDERS

FOR EACH ROW

BEGIN

      DELETE FROM ORDERDETAILS OD

      WHERE OD.ORDERID=:OLD.ORDERID;

      DBMS_OUTPUT.PUT_LINE('删除订单及订单明细信息成功');

END TRG_ADDPRODUCT;

更新触发器

当需要更新产品表PRODUCT的数据记录时,需要同时判断该数据记录的产品类别编号是否存在,若存在,则显示表示正确的消息;否则显示表示错误的信息。

CREATE OR REPLACE TRIGGER TRG_UPDATEPRODUCT

BEFORE UPDATE

ON PRODUCT

FOR EACH ROW

DECLARE

    counter INTEGER;

BEGIN

    SELECT COUNT(*) INTO counter

    FROM CATEGORY

    WHERE  CATEGORYID=:NEW.CATEGORYID;

    IF counter>0  THEN

        DBMS_OUTPUT.PUT_LINE('更新产品信息成功');

   ELSE

       DBMS_OUTPUT.PUT_LINE('产品类别编号'||:NEW.CATEGORYID||'不存在');

   END IF;

END TRG_ADDPRODUCT;

混合型触发器

当需要对用户方案的产品表PRODUCT执行DML操作时,需要根据不同的DML操作返回不同的信息

CREATE OR REPLACE TRIGGER TRG_INS_UPD_DEL_PRODUCT

BEFORE INSERT OR UPDATE OR DELETE

ON PRODUCT

FOR EACH ROW

BEGIN

    IF  INSERTING THEN

        DBMS_OUTPUT.PUT_LINE('新产品的名称是'||:NEW.PRODNAME);

    ELSE UPDATING THEN

        DBMS_OUTPUT.PUT_LINE('产品的原有名称是'||:OLD.PRODNAME);

    ELSE

       DBMS_OUTPUT.PUT_LINE('被删除产品的名称是'||:OLD.PRODNAME);

    END IF

END TRG_INS_UPD_DEL_PRODUCT;

原创粉丝点击