本篇文章给大家带来了关于oracle的相关知识,详细讲解了oracle中的序列sequence,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。
推荐教程:《oracle视频教程》
一、序列介绍oracle的序列是一种数据库对象,主要作用是用来产生唯一值。序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享。
二、创建序列序列使用create sequence语法进行创建:
create sequence sequence [increment by n] [start with n] [{maxvalue n | nomaxvalue}] [{minvalue n | nominvalue}] [{cycle | nocycle}] [{cache n | nocache}];
ncrement by:用于定义序列的步长,如果省略,则默认为1,如果是负值,则代表序列的值是递减的。start with:定义序列的初始值(即产生的第一个值),默认为1。maxvalue:定义序列能生成的最大值。nomaxvalue是默认选项,代表没有最大值,这时,对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。minvalue:定义序列能生成的最小值。nominvalue是默认选项,代表没有最小值,这时,对于递减序列,系统能够产生的最小值是负的10的26次方;对于递减序列,最小值是1。cycle和nocycle:表示当序列生成器的值达到限制后是否循环。如果循环,当递增序列达到最大值时,循环到最小值;对于递减序列,达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。cache:定义存放序列的内存块的大小,默认为20。nocache表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。例如:
create sequence invoice_seqincrement by 1start with 1maxvalue 9999999nocycle nocache;
三、查询序列一旦序列被创建,序列的创建代码就被文本化在数据字典中,可以在user_objects数据字典中看到,如:
select object_name,object_id,object_type from user_objects where object_name = 'invoice_seq';
在user_sequences表中保存了序列明细信息:
select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;
四、使用序列nextval和currval伪列nextval:返回下一个可用的序列值,它每次返回一个唯一的被引用值,实际对不同的用户也是如此。当使用sequence.nextval时,一个新的序列数被产生并且当前的序列数被放入currval。currval:获得当前的序列值。在首次使用nextval之前就使用currval的话,会报错。使用如下 :
select invoice_seq.currval,invoice_seq.nextval from dual;insert into invoice (invoice_id, vendor_id, invoice_number, invoice_total ) values (invoice_seq.nextval, 10, 'inv' || invoice_seq.currval, 100 );
可以在下面的上下文中使用nextval和currval:
不是子查询的一部分的select语句的字段列表。insert语句中子查询的select列表。insert语句中的values子句。update语句中的set子句。不能再以下的上下文中使用nextval和currval:
视图的select列表。带distinct的select语句。带group by、having或order by子句的select语句。在select、delete或update语句中的子句。在create table或alter table语句中的default表达式。另外要注意,rollback并不能使序列值回滚。
五、修改序列如:
alter sequence invoice_seq increment by 2 maxvalue 10 nocache nocycle;
修改序列时,有如下几个限制:
不能该表序列的起始值。最小值不能大于当前值。最大值不能小于当前值。修改后的序列规则不会影响以前的序列值,只有未来的序列值会受到影响。用户必须具有alter sequence的权限。六、删除序列drop sequence invoice_seq;
七、创建自增序列1、创建一个序列
create sequence sq_recid minvalue 1 maxvalue 999999 increment by 1 start with 1 nocycle;
2、创建一个触发器
create or replace trigger trg_test before insert on test for each rowbegin select sq_recid.nextval into :new.id from dual;end;alter trigger trg_test enable;
3、在c#中也可以手工插入序列到表中
string sql="insert into test(id,othercol)value (sql_recid.nextval,***) retuing id into :id"
推荐教程:《oracle视频教程》
以上就是oracle的序列sequence解析的详细内容。