已经有了序列后,怎么样自动生成ID?
其实是用一条包含序列号的sql语句从dual表中查出的id再赋值给id
以下举两条实战的sql:
select '00010222' || lpad(seq_spc_service_region_id.nextval, 16, '0') from dual ;
生成的格式为:000102220000000000000001
select 'ResINF'||TO_CHAR(SYSDATE,'YYYYMMDD')||to_char(sysdate,'HH24MISS')||lpad(seq_code_to_crm.nextval,10,'0') from dual
生成的格式为:ResINF2014041019022312266
在每次插入执行前,执行查询结果赋值给你bean中的id即可实现在每次插入数据时自动增加
1、创建一个用户表t_sys_user,其中有id,login_name,login_pwd三个字段,ID为自动增长列:
create table t_sys_user
(
id number(6) not null primary key,
login_name varchar2(50) not null,
login_pwd varchar2(50) not null
);
2、创建序列:
create sequence seq_user
increment by 1//指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。
start with 1//指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列 可由比最大值小的值开始,缺省值为序列的最大值。
maxvalue 9999//指定序列可生成的最大值。
cycle nocache//一直累加,不循环
影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。
一旦定义了序列seq_user,你就可以用CURRVAL,NEXTVAL CURRVAL=返回 sequence的当前值 NEXTVAL=增加sequence的值,然后返回 sequence 值 比如: emp_sequence.CURRVAL emp_sequence.NEXTVAL 可以使用sequence的地方: - 不包含子查询、snapshot、VIEW的 SELECT 语句 - INSERT语句的子查询中 - NSERT语句的valueS中 - UPDATE 的 SET中
SELECT empseq.currval FROM DUAL; //查看当前的序列值
3.创建触发器
create or replace trigger tri_user
before insert on t_sys_user for each row
begin
select seq_user.nextval into:new.id from dual; //这里是最容易出错的地方
end;4.测试
insert into t_sys_user (login_name,login_pwd) values ('zhanggc','123456');
5.oracle修改序列化:Alter Sequence
你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence .如果想要改变 start值,必须 drop sequence 再 re-create .
需要注意的是:想改变序列化的minvalue必须删除序列化后再重新建立序列化。不可以修改序列化 的minvalue。
alert sequence emp_sequence
increment by 10
maxvalue 10000
cycle //到10000后从头开始
nocache ;
oracle删除序列化:
DROP SEQUENCE seq_user;
oracle查询序列:
SELECT * FROM SEQUENCE WHERE seq_id = ?;
注意的地方:
①第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。
②如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
创建触发器的第二种方式:
create or replace trigger tri_test_id
before insert on t_sys_user //t_sys_user 是表名
for each row
declare
nextid number;
begin
IF :new.id IS NULL or :new.id=0 THEN //id是列名
select seq_user.nextval //seq_user正是刚才创建的
into nextid
from sys.dual;
:new.id:=nextid;
end if;
end tri_test_id;