原文地址:http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns002.htm
序列是能够产生连续唯一值的模式对象。这些值通常用于主键和唯一键。可以在SQL语句中使用以下伪列引用序列的值:
CURRVAL:返回序列的当前值。
NEXTVAL:递增序列并返回下一个值。
必须使用序列名称修饰CURRVAL和NEXTVAL:
sequence.CURRVAL
sequence.NEXTVAL
要引用另一个用户模式下的序列的当前值或者下一个值,必须被授予该序列上SELECT对象权限或者SELECT ANY SEQUENCE系统权限,并且必须指定包含序列的模式:
schema.sequence.CURRVAL
schema.sequence.NEXTVAL
要引用远程数据库中的序列值,必须指定数据库链接的名称:
schema.sequence.CURRVAL@dblink
schema.sequence.NEXTVAL@dblink
序列值的应用场景
序列的CURRVAL和NEXTVAL可以用于以下位置:
非子查询、物化视图或者视图中的SELECT语句的选择列表中。
INSERT语句中的子查询的选择列表中。
INSERT语句的VALUES子句中。
UPDATE语句的SET子句中。
序列值的限制
不能在以下结构中使用CURRVAL和NEXTVAL值:
DELETE、SELECT或者UPDATE语句的子查询中。
视图或者物化视图的查询中。
带DISTINCT操作符的SELECT语句中。
带GROUP BY子句或者ORDER BY子句的SELECT语句中。
与另一个SELECT语句通过UNION、INTERSECT或者MINUS集合操作符进行联合的SELECT语句中。
SELECT语句的WHERE子句中。
CREATE TABLE或者ALTER TABLE语句中列的DEFAULT值。
CHECK约束的条件中。
在使用CURRVAL或者NEXTVAL的单条SQL语句中,所有引用的LONG列、被更新表以及被锁定表必须位于同一个数据库中。
序列值的使用方法
定义序列时,可以指定它的初始值和增量。第一次引用NEXTVAL将会返回初始值。随后的NEXTVAL引用将会递增序列的值并返回新值。CURRVAL总是返回序列的当前值,即最后一次引用NEXTVAL返回的值。
在会话中首次使用CURRVAL之前,必须先使用NEXTVAL进行初始化。
在单条SQL语句中引用NEXTVAL时,Oracle按照以下方式递增序列:
- SELECT语句的外部查询块返回的每一行递增一次。这类查询块可以出现在以下地方:顶层SELECT语句;INSERT ... SELECT语句。对于多表插入,NEXTVAL必须位于VALUES子句中,序列对于子查询返回的每一行递增一次,即使多个分支引用了NEXTVAL;CREATE TABLE ... AS SELECT语句;CREATE MATERIALIZED VIEW ... AS SELECT语句。
- UPDATE语句更新的每一行递增一次。
- 每一条包含VALUES子句的INSERT语句递增一次。
- MERGE语句合并的每一行递增一次。NEXTVAL可以出现在merge_insert_clause或者merge_update_clause子句中,也可以同时出现。NEXTVAL对于更新和插入的每一行递增一次,即使序列数值没有用于更新或者插入操作。如果NEXTVAL在这些位置中指定了多次,每一行递增一次,用于该行的所有NEXTVAL都返回相同的值。
如果这些位置包含多个NEXTVAL引用,对于所有的NEXTVAL序列递增一次并返回相同的值。
如果这些位置同时引用CURRVAL和NEXTVAL,Oracle递增序列并为CURRVAL和NEXTVAL返回相同的值。
序列可以同时被许多用户访问,不存在等待和锁定。
示例:查找序列的下一个值
以下示例查询了模式hr中雇员序列的下一个值:
示例:将序列值插入表中
以下示例递增雇员序列并将其值用于向表hr.employees中插入一个新雇员信息:
示例:复用序列的当前值
以下示例使用下一个订单序列号向主订单表中插入一条订单,然后使用该订单号向订单细节表中添加多个子条目:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24945919/viewspace-747847/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24945919/viewspace-747847/