• 触发器


      触发器是一个与表相关联的,存储下来可以自动执行的PL/SQL程序。每当一个特定的数据操作语句(insert,update,delete)在指定的列上发出时,oracle自动地执行触发器定义的语句序列。虽然触发器对于很多事情特别方便,避免了我们手动的调用,但是却带来了一些其他问题,例如定义一个插入数据时主键编号自动增长的触发器,当其他用户进行数据操作时并不知道定义了该触发器,插入数据时会将主键编号也插入,就会出现操作错误。所以,虽然触发器有一定的优点,但是还是要少用。

    一.分类

      1.语句级触发器

          在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。

      2.行级触发器(for each row)

          触发语句作用的每一条记录都被触发。只有在行级触发器中才能使用old和new伪记录变量,识别值得状态。

    二.语法

      create [or replace] trigger 触发器名

      {before|after}

      {delete|insert|update[of 列名]}

      on 表名

      [for each row[when(条件)]]

      PL/SQL块

    触发语句 :old :new
    insert   将要插入的数据
    update 将要更改的数据 更改后的数据
    delete 将要删除的数据  

      示例一:插入数据时id自动增长

    --创建表
    create table ttemp2
    (id number(10) primary key,
    name varchar2(29) not null
    );
    --创建序列
    create sequence myid;
    --创建触发器
    create or replace trigger tri_id
    before insert on ttemp2
    for each row
    declare
      mid number;
    begin
      select myid.nextval into mid from dual;
      :new.id := mid;
    end;
    --插入数据时id自动增长
    insert into ttemp2(name) values('gyx'); 

      示例二:插入数据时姓名不能以J开头

    --定义触发器
    create or replace trigger tri_t1
    before insert on ttemp2
    for each row
    declare
    begin
      dbms_output.put_line(:new.id||' '||:new.name);
      if :new.name like 'j%' then
        RAISE_APPLICATION_ERROR(-20000,'限制写入以J开始的串');
      end if;
    end;
    --插入数据
    set serveroutput on;--打开控制台输出
    insert into ttemp2(name) values('jxws');

      示例三:在触发器内部判断是哪种操作

    create or replace trigger tri_t2
    before insert or update of name or delete on ttemp2
    declare
    begin
      if inserting then
        dbms_output.put_line('这是插入数据');
      elsif deleting then
        dbms_output.put_line('这是删除数据');
      else 
        dbms_output.put_line('这是更新数据');
      end if;
    end;
    rollback;
    select * from ttemp2;
    set serveroutput on;
    --测试插入语句
    insert into ttemp2(name) values('gyxx');
    --测试更新语句
    update ttemp2 set name = 'xws' where name = 'gyx';  --该语句触发触发器
    update ttemp2 set id = 200 where id = 1;  --该更新语句不能触发触发器,只有对name列的更新才能触发

    三.查看触发器,存储过程,函数

      1.查看触发器

    select * from SYS.user_triggers;

      2.查看存储过程

    select * from user_procedures;

      3.查看函数

    select * from user_source where type='FUNCTION';

      4.查看触发器、存储过程、函数

    select * from user_source;
  • 相关阅读:
    调度算法的评价指标
    进程调度的时机 切换与过程调度方式
    处理机调度 概念和层次
    线程概念 多线程模型
    进程通信
    进程的状态与转换
    进程的定义
    系统调用
    面试题3
    第2章Arduino UNO板结构说明
  • 原文地址:https://www.cnblogs.com/zlbx/p/4820683.html
Copyright © 2020-2023  润新知