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