一、Oracle数据库
1、创建序列
SQL> CREATE SEQUENCE name [INCREMENT BY n]
[START WITH n] [{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
2、查询序列
(1)查询下一个将要使用的序列
select SEQ_NAME.nextval from dual
(2)查询当前序列
select SEQ_NAME.currval from dual
使用这条语句的时候要特别注意,因为在使用currval之前,必须先使用nextval,否则就会异常;而且,必须在同一个连接内,先使用nextval之后,才能使用currval。如果使用了nextval,然后断开了连接;重新连接后使用currval仍然会异常。
(3)查询序列详细信息(Oracle对于不同用户创建的Sequence是隔开的,所以也可以不用传入用户名)
select SEQUENCE_OWNER,SEQUENCE_NAME from dba_sequences where sequence_owner='用户名';
- Oracle将sequence的定义存储在数据字典之中。
- Sequence是独立于事务的,就是说序列的增加不需要等待事务的完成,也就是说序列是异步于事务而增长的。这说明,你访问不到别的用户使用该sequence产生的值,也就是说你只能访问到你当前产生的值,即使其他用户已经增加了sequence的值;还说明如果事务回滚,sequence不会回滚,它所发生的改变是一维的。
3、更改序列
SQL> ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];
注意: 不能改变它的起始值(但是有其他的方法实现这一功能,参见最后Oracle和DB2差异比较)
如果要改变序列的起始值, 先把序列号删除掉, 再新建一个。
4、删除序列
SQL>DROP SEQUENCE sequence;
5、Oracle数据字典
- 数据字典表所有者是sys用户,其数据字典表和数据字典视图都保存在system表空间中。除sys用户,任何用户(包括DBA)都不能直接更改数据字典,但可以查询其中的信息,即数据字典是只读的。
- 数据字典分为静态数据字典和动态数据字典。
- 静态数据字典:是指在用户访问数据字典时内容不会发生改变,这类数据字典主要是由表和视图组成,数据字典中的表是不能被直接访问的,但是可以访问数据字典中的视图,静态数据字典中的视图分为三类,分别有三个前缀构成:user_*,all_*,dba_*。
- 动态数据字典:Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图,由于数据库运行时它们会不断更新,因此称它们为动态数据字典。
二、DB2数据库
1、创建序列
CREATE SEQUENCE <sequence-name>
AS data-type 默认 As Integer
START WITH <numeric-constant>
INCREMENT BY <numeric-constant> 默认 INCREMENT BY 1
MINVALUE <numeric-constant> | NO MINVALUE 默认 NO MINVALUE
MAXVALUE <numeric-constant> | NO MAXVALUE 默认 NO MAXVALUE
NO CYCLE | CYCLE 默认 NO CYCLE
CACHE <numeric-constant> | NO CACHE 默认 CACHE 20
NO ORDER | ORDER 默认 NO ORDER
2、查询序列
(1)查询下一个将要使用的序列
select nextval for seq_name from sysibm.sysdummy1;
(2)查询当前序列
select prevval for seq_name from sysibm.sysdummy1;
(3)查询序列详细信息(当前用户,current user表示当前连接的用户,相当于内置变量)
SELECT * FROM syscat.sequences where SEQSCHEMA = current user;
3、更改序列
同Oracle,需以DB2语法
4、删除序列
同Oracle
三、Oracle与DB2的差异
除语法差异,以及查询差异外,这里主要讲一个重设开始值的差异
- ORACLE:取得下一个值;先设置步长(下一个值 与 设置的开始值之间差);取得下一个值;再把步长修改成原来值 。
- DB2:ALTER SEQUENCE 序列名 RESTART WITH 下一值。