1.首先是序列的定义:
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
CURRVAL 中存放序列的当前值
NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效
例子:
create sequence SYID2 minvalue 1 maxvalue 9999999999999 start
with 9 increment by 1 nocache order;
调用:
select SYID2.nextval from dual;
2.其次是触发器的定义:
CREATE [OR REPLACE] TRIGGER trigger_name
INSTEAD OF
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.] view_name --只能定义在视图上
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ] --因为INSTEAD OF触发器只能在行级上触发,所以没有必要指定
[WHEN condition]
PL/SQL_block | CALL procedure_name;
:new --为一个引用最新的列值;
:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;
例子: create or replace trigger SYIDtrigger2 //触发器名字
before insert on ashare_cjhb //触发条件
for each row //触发级别
begin
select SYID2.nextval into :new.rec_num from dual; //pl/sql块
end;
/
自增长序列的实现:(原理就是在触发器中定义要触发的事件,然后在触发器中实现在触发该事件是使用sequence,就达到了自增长的目的)
drop sequence SYID2;
create sequence SYID2 increment by 1 start with 1 minvalue 1 maxvalue 9999999999999 nocache order;
--drop trigger SYIDtrigger;
create or replace trigger SYIDtrigger2
before insert on ashare_cjhb
for each row
begin
select SYID2.nextval into :new.rec_num from dual;
end;
/