oracle批量创建序列号,Oracle数据库中创建并利用序列号生成ID

已经有了序列后,怎么样自动生成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;