oracle序列

oracle序列

序列是一个数据库对象,多个用户可以从中生成唯一的整数。您可以使用序列自动生成主键值 ,生成序列号时,序列会递增,与事务提交或回滚无关。 如果两个用户同时递增相同的序列,则每个用户获取的序列号可能有间隙,因为序列号是由另一个用户生成的。一个用户永远无法获取另一个用户生成的序列号。 在由一个用户生成序列值之后,该用户可以继续访问该值,而不管该序列是否由另一个用户递增。

序列号是独立于表生成的,因此相同的序列可用于一个或多个表。单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。另外,单个用户可能没有意识到其他用户正在从相同的序列中绘制。 创建序列后,可以在SQL语句中使用CURRVAL伪列访问其值,该伪列返回序列的当前值,或NEXTVAL伪列,它会递增序列并返回新值。

必备条件

  • 具有创建序列的权限

  • 要在另一个用户的架构中创建序列,您必须具有CREATE ANY SEQUENCE系统权限。

创建序列

语法

CREATE SEQUENCE [ schema. ] sequence
   [ { INCREMENT BY | START WITH } integer
   | { MAXVALUE integer | NOMAXVALUE }
   | { MINVALUE integer | NOMINVALUE }
   | { CYCLE | NOCYCLE }
   | { CACHE integer | NOCACHE }
   | { ORDER | NOORDER }
   ]...
;

实验过程

使用system用户登录,创建一个表空间(下面的datafile文件路径必须确保有文件夹)

创建表空间

create tablespace tbsp_test
datafile 'G:/oracle/tablespace/tbsp_test.dbf'
size 50M autoextend off;

创建用户

create User u_test
identified by 111111
default tablespace tbsp_test;

授予resource角色

grant resource to u_test;

授予session权限

grang create session to u_test;

使用u_test登录

discon;
connect u_test/111111;

创建一个序列

create sequence u_test_emp_sequence
increment by 5
maxvalue 1000
minvalue 10
nocycle
cache 30
order;

解释

  • increment 每次增长的值
  • maxvalue 最大值
  • minvalue 最小值
  • nocycle 不循环
  • cache 缓存序列个数
  • order 有序的

使用序列

select    u_test_emp_sequence.CURRVAL  from dual;

错误记录

ORA-08002: 序列 U_TEST_EMP_SEQUENCE.CURRVAL 尚未在此会话中定义。

这是因为在一个新的会话中,序列需要初始化 。

select    u_test_emp_sequence.nextval  from dual; -- 结果为10

起始值为5所以下一个为5.

在查询一次就成为了15了。

此时再使用

select    u_test_emp_sequence.CURRVAL  from dual;-- 现在可以得到15了

修改序列

修改最大值

alter sequence u_test_emp_sequence
  maxvalue 30;

当我们修改为30之后,再使用查询下一个序列执行几次之后,序列将被消耗完毕,再查询,就会出现序列无法实例化。

同时修改多个参数值

alter sequence u_test_emp_sequence
increment by 2
maxvalue 60 minvalue -5
cycle
cache 5;

此时序列满了之后,他将会重新循环,注意,cache不能大于cycle的数量。

比如最小值5,最大值18,步数为2,也就是说其中最多可用的数量为6,那么cahce数量就不能超过6.

删除序列

drop sequence u_test_emp_sequence;
原文地址:https://www.cnblogs.com/qiudaozhang/p/9482744.html