• DML 触发器2


    2.行级触发器的关联标识符 :new,:old
    
        >>1. 一般通过:new.filed 引用(filed是trigger_table的字段名)
    :new :old中filed字段的意义
    触发语句 :old  :new
        insert 未定义--所有字段为null 触发语句完成时,要插入的值
        update 更新以前相对应记录行的值 触发完成后,要更新的值
        delete 删除以前记录行的值         未定义-null

         >>2. :new,:old的用法

    create or replace trigger GenerateAuthorId
        before insert on or update on Authors
        for each row
    begin
        select author_sequence.nextval
        into :new.ID    --:new.ID表示触发完成后,要插入的值. 就是说将 -1改为nextval
        from dual;
    end GenerateAuthorId;
    /
    
    insert into authors(ID,first_name,last_name)
    vaules(-1,'David','Zheng');

      新插入的ID的值将会是author_sequence.nextval不是-1.

      >>3.虽然:new,:old的类型是trigger_table%rowtype,但是不能整体赋值,只能为每一个属性赋值(有点像C中结构体)

    create or replace trigger TempDelede
        before delete on temp_table
        for each row
    declare
        v_TempRec temp_table%rowtype
    begin
        v_TempRec:=old;  --错误赋值,会编译报错
        v_TempRec.char_col:=:old.char_col;  --正确赋值
        v_TempRec.num_col:=:old.num_col;    --正确赋值
    end TempDelede;
    /

      >>3. referencing 子句
    语法:referencing[old as old_name][new as new_name]
    这样就可以用old_name代替:old。注意referencing 中都不带冒号,但是实际使用是还是要加冒号的。

    create or replace trigger GenerateAuthorId
        before insert on or update on Authors
        referencing new as new_author     --都不带冒号
        for each row
    begin
        select author_sequence.nextval
        into :new_author.ID    --带冒号
        from dual;
    end GenerateAuthorId;
    /

      >>4.when子句
    when语句在行级触发器中起限制作用
    when trigger_condition
    new,old 在trigger_condition中都和referencing一样不加冒号

    create or replace trigger CheckPrice
        before insert or update  of price on books
        for each row
        when  (new.price>500.00)  --new没加冒号
    begin
        DBMS_OUTPUT.PUT_LINE('price is higher than 500');
    end CheckPrice;
    /

      >>5.触发器谓词:inserting,updating,deleting
    inserting,updating,deleting是布尔函数,在使用相应的触发器会返回True 或者False

    谓词         行为特征
    inserting 如果激活语句是insert,就为True,否则为False
    updating 如果激活语句是update,就为True,否则为False
    deleting 如果激活语句是delete,就为True,否则为False

    eg.当改变inventory表时,使用invent_audit表记录 更改的用户名,更改的类型,更改了什么

    create table inventory_audit(
        change_type char(1) not null, 
        change_by varchar2(8) not null,
        timestramp date not null,
        old_isbn char(10),
        new_isbn char(10),
        old_status varchar(25),
        new_status varchar(25),
        old_amount varchar(25),
        new_amount varchar(25)
        );   ---创建 inventory_audit
    
    
    create or replace LogInventoryChanges
        before insert or update or delete on inventory
        for each row
    declare
        v_ChangeType char(1);
    begin
        if inserting then v_ChangeType='I'  --用I表示Insert
        elsif updating then v_ChangeType='U'
        else v_ChangeType='D'
        insert into inventory_audit(    --将改变的状态插入到inventory_audit表中
            change_type,change_by,timestamp,
            old_isbn,new_isbn,old_status,new_status,old_amount,new_amount
            )
        vaules(
            v_ChangeType,user,sysdate,
            :old.isbn,:new.isbn,:old.status,:new.status,:old.amount,:new.amount
            )
    end LogInventoryChanges;
    /
  • 相关阅读:
    string类型版本号比较
    地图
    使用libcurl显示下载进度
    欧几里德&扩展以及求解线性方程学习总结--附上poj1061解题报告
    [置顶] 两台一级域名相同二级域名不同的服务器,怎么共享session
    [源码分享] HIVE表数据量统计&邮件
    Domino 迁移到Exchange 服务器 之在Domino Server 创建用户!
    Lotus 迁移到Exchange POC 之 新建2007 服务器!
    uva 10056
    Lotus 迁移到Exchange 2010 POC 之在Exchange 2007安装Transport Suite!
  • 原文地址:https://www.cnblogs.com/qianwen/p/3766202.html
Copyright © 2020-2023  润新知