Sequences and triggers
sequence
序列是Oracle数据库中特有的一个对象,用来生成一组等间隔的数值。
序列(Sequence)是用来生成连续的整数数据的对象。
序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成。
currval 表示序列的当前值,新序列必须使用一次nextval 才能获取到值,否则会报错;
nextval 表示序列的下一个值。
新序列首次使用时获取的是该序列的初始值,从第二次使用时开始按照设置的步进递增查询序列的下一个值;
(第一次需要先查询下一个值,然后才能查询当前值)
trigger
1)触发器是一种特殊类型的存储过程,它不同于存储过程。
触发器主要是通过事件进行触发而被执行的, 触发器的触发事件分可为3类,分别是DML事件、
DDL事件和数据库事件,而存储过程可以通过存储过程名字而被直接调用 。
2)触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
3)触发器的种类可划分为4种:
1.数据操纵语言(DML)触发器:是定义在表上的触发器,创建在表上。由DML事件引发的触发器,编写DML触发器时的两点要素是: 1.确定触发的表,即在其上定义触发器的表。2.确定触发的事件,DML触发器的触发事件有INSERT、UPDATE和DELETE三种;
2.替代(INSTEAD OF)触发器:创建在视图上,用来替换对视图进行的删除、插入和修改操作;
3.数据定义语言(DDL)触发器:定义在模式上,触发事件是数据对象的创建和修改;
4.数据库事件触发器:定义在整个数据库或模式上,触发事件是数据库事件。
4)ORACLE产生数据库触发器的语法为:
CREATE OR REPLACE TRIGGER 触发器名
{BEFORE|AFTER|INSTEAD OF} 触发事件1 [OR 触发事件2...]
ON 表名
WHEN 触发条件
FOR EACH ROW
DECLARE
声明部分
BEGIN
sql(指定触发器触发时将要执行的语句块)
END;
定义
1、触发事件: 如DML语句(INSERT、UPDATE、DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
2、触发条件: 触发条件是由WHEN子句指定的一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作,否则即便遇到触发事件也不会执行触发器。
3、触发对象: 触发对象包括表、视图、模式、数据库。只有在这些对象上发生了符合条件的触发事件,才会执行触发事件。
注释:
1、BEFORE|AFTER|INSTEAD OF: 指定触发器的触发时间。BEFORE和AFTER分别表示在事件执行之前和之后执行触发器。INSTEAD OF指定创建替代触发器,触发事件不执行,而执行触发器本身的操作。
2、多个触发事件之间使用OR连接;
3、FOR EACH ROW: 指定该选项时,当前触发器为行触发器;否则为语句触发器。(触发器可以分为语句级触发器和行级触发器。语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。)
4、WHEN 触发条件: 设置执行触发器的条件,当条件表达式的值为逻辑真时,可以执行触发器;否则不执行该触发器。
5)触发器的触发条件成立的时候,触发器里面所定义的语句就会被自动的执行。
6)同一个表上的多个触发器激活时遵循如下的执行顺序:
1、执行该表上的BEFORE触发器。
2、激活触发器的SQL语句。
3、执行该表上的AFTER触发器。
对于同一个表上的多个BEFORE(AFTER)触发器,遵循“谁先创建谁先执行”的原则,即按照触发器创建的时间先后顺序执行。
Key point: Ensure that the sequence has been created before the trigger can be created successfully.
// 创建序列sql:
create sequence 序列名
increment by 1 ---每次自增1
start with 1 ---从1开始计数
nomaxvalue ---不设置最大值
nominvalue
nocache;
// 删除序列
drop sequence 序列名;
//查询序列的下一个值
select seq_name.nextval from dual;
//查询序列的当前值
select seq_name.currval from dual;
// 创建触发器实列sql
create or replace trigger 触发器名称
before insert on 表名 for each row
begin
select 序列名.nextval into :new.ID from dual;
end;