Oracle触发器(Trigger)与序列(Sequences)


Oracle触发器(Trigger)与序列(Sequences)


 


  触发器(Trigger)就是一个特殊的存储过程,Trigger由事件触发执行,不用匿名语句块去调用,在数据库表中执行DML语句“只改变某一张表的数据结果,而不改变表结构的语句(select/inster/update/delete)”,触发器经常用于加强数据完整性和业务规则等。例如:通过数据库表的记录的修改来执行审计功能,有些复杂的数据完整性约束无法在创建表的时候以声明的方式解决...

 


  触发器的类型可分为:DML触发器(常用),创建在表上由DML事件引发。INSTEAD OF触发器,创建在视图上,用来替换对视图进行的INSERT/DELETE/UPDATE。DDL触发器,定义在模式上,触发事件是数据库对象的创建或修改。数据库事件触发器,定义在整个数据库或模式上,触发事件是数据库事件。(了解更多请参阅《Oracle数据库入门与实践》)。

 

  触发器由触发器名称(无实际用途)、触发时间(BEFORE,AFTER)、触发事件(INSERT,UPDATE,DELETE)、触发类型(ROW,STATEMENT)、触发体(PL/SQL块)。语法如下:

 


  CREATE [OR REPLACE] TRIGGER 触发器名 触发时间 触发事件

  ON 表名

  [FOR EACH ROW]

  PL/SQL语句块

 

 

 

ORACLE TRIGGER应用应该注意些“神马”?

 


  1>触发器可以从DBM_TRIGGERS/USER_TRIGGERS数据字典中查到,一个表最多可以定义12种触发器

 


  2>DML语句正在操作的表触发器是不能访问的

 


  3>触发器中不能使用COMMIT

 


  4>FOR EACH ROW对表一行触发执行一次,不写表示是表级触发器,无论操作多少行只触发一次

   

  5>:NEW只出现在INSERT/UPDATE中,:OLD出现在UPDATE/DELETE,INSERT时:NEW表示新插入的行数据,UPDATE时:NEW表示要替换的新数据,:OLD表示要被更改的原来数据,DELETE时:OLD表示要被删除的数据。


Oracle的dualOracle中的dual的含义:


1. dual 确实是一张表.是一张只有一个字段,一行记录的表.

2.习惯上,我们称之为'伪表'.因为他不存储主题数据.dual 是oracle的虚拟表,不是真实存在的.

3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.

如:select * from mytable ;select * from myview;等等.但如果我们不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们想得到的信息,并要通过select 完成时,就要借助一个对象,这个对象,就是dual;
如我们要计算 999*999 的值,可以用:select 999*999 from dual;来实现;
要拼接一个电话信息:select concat('010-','88888888')||'转23' 高乾竞电话 from dual;就变成了我们想要的格式输出.

4.当然,我们不一定要dual ,也可以这样做.

例如:create table mydual( dummy varchar2(1));也可以实现和dual 同样的效果:select 999*999 from mydual;不过,dual 我们都用习惯了,就无谓自己再搞一套了.

 

 

下面是ORACLE触发器与序列的简单应用:


  create or replace trigger table_

      after insert or update on table_1

      for each row

  begin

      if inserting then

          insert into table_2(sid_,id_,name_,sex_,address_)

          values (oracle_sequences.nextval,:new.id_1,:new.name_1,:new.sex_1:new.address_1);

      elsif updating('name_1') or updating('address_1') then

          update table_2 set address_ = :old.address_1,name_ = :old.name_1

          where id_ = :old.id_1;

      end if;

  end table_tg;


 

 

再附上一个完整的例子:

SQL> CREATE SEQUENCE test_sequence2
  2    increment by 1    -- 每次递增1
  3    start with 1       -- 从1开始
  4    nomaxvalue      -- 没有最大值
  5    minvalue 1       -- 最小值=1
  6    NOCYCLE;      -- 不循环

Sequence created.


SQL> CREATE TABLE test_create_tab2 (
  2    id   INT,
  3    val  VARCHAR(10),
  4    PRIMARY KEY (id)
  5  );

Table created.

SQL> CREATE OR REPLACE TRIGGER BeforeTestCreate2Insert
  2    BEFORE INSERT ON test_create_tab2
  3  FOR EACH ROW
  4  BEGIN
  5    SELECT test_sequence2.nextval INTO :new.id  FROM dual;
  6  END;
  7  /

Trigger created.

SQL> INSERT INTO test_create_tab2(val) VALUES ('NO id');

1 row created.

SQL> INSERT INTO test_create_tab2(id, val) VALUES (1, 'id no use');

1 row created.

SQL> SELECT * FROM test_create_tab2;

        ID VAL
---------- --------------------
         1 NO id
         2 id no use

 
 

 

阅读更多
个人分类: 数据库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭