1、创建序列语法
CREATE SEQUENCE sequence
[INCREMENT BY n] //序 列值间隔,默认为1 如果指定的为负数,序 列值将递减产生
[START WITH n] //起始序 列值,默认为1
[{MAXVALUE n | NOMAXVALUE}] //最大序 列值 | 最大序 列值为10的27次方,降序的最大值为-1
[{MINVALUE n | NOMINVALUE}] //最小序 列值 | 升序最小序 列值为1,降序最小序 列值为-10的26次方
[{CYCLE | NOCYCLE}] //序 列值在达到指定最大或最小值之后继续产生序 列值(从头再开始),NOCYCLE不再生产(默认值)
[{CACHE n | NOCACHE}]; //序 列被预先分配存储到内存,NOCACHE默认值
CREATE SEQUENCE sequence
[INCREMENT BY n] //序 列值间隔,默认为1 如果指定的为负数,序 列值将递减产生
[START WITH n] //起始序 列值,默认为1
[{MAXVALUE n | NOMAXVALUE}] //最大序 列值 | 最大序 列值为10的27次方,降序的最大值为-1
[{MINVALUE n | NOMINVALUE}] //最小序 列值 | 升序最小序 列值为1,降序最小序 列值为-10的26次方
[{CYCLE | NOCYCLE}] //序 列值在达到指定最大或最小值之后继续产生序 列值(从头再开始),NOCYCLE不再生产(默认值)
[{CACHE n | NOCACHE}]; //序 列被预先分配存储到内存,NOCACHE默认值
2、建立序列
CREATE SEQUENCE dept_deptno
INCREMENT BY 20
START WITH 50
MAXVALUE 200
NOCACHE
CYCLE
/
CREATE SEQUENCE dept_deptno
INCREMENT BY 20
START WITH 50
MAXVALUE 200
NOCACHE
CYCLE
/
3、伪列:NEXTVAL和CURRVAL
NEXTVAL:用于返回序 列下一个可获取的值。引用(sequence).NEXTVAL时,一个新的序 列值产生并保存到CURRVAL伪列。对于每次引用都产生下一个序 列值并返回,对于不同的用户引用也是一样。
CURRVAL:被引用前必须使用NEXTVAL产生一个序 列值,用于提取当前用户产生的序 列值。
NEXTVAL:用于返回序 列下一个可获取的值。引用(sequence).NEXTVAL时,一个新的序 列值产生并保存到CURRVAL伪列。对于每次引用都产生下一个序 列值并返回,对于不同的用户引用也是一样。
CURRVAL:被引用前必须使用NEXTVAL产生一个序 列值,用于提取当前用户产生的序 列值。
4、查询序列
查询当前序 列值
SELECT dept_deptno.CURRVAL FROM dual;
查询下一个返回的序 列值
SELECT dept_deptno.NEXTVAL FROM dual; 注意:这样也是对NEXTVAL的引用,会产生下一个序 列值
如果序 列不是保存在内存中的,可以查看数据字典,这样不会产生新的序 列值
SELECT sequence_name, min_value, max_value,
increment_by,last_number
FROM user_sequences
/
查询当前序 列值
SELECT dept_deptno.CURRVAL FROM dual;
查询下一个返回的序 列值
SELECT dept_deptno.NEXTVAL FROM dual; 注意:这样也是对NEXTVAL的引用,会产生下一个序 列值
如果序 列不是保存在内存中的,可以查看数据字典,这样不会产生新的序 列值
SELECT sequence_name, min_value, max_value,
increment_by,last_number
FROM user_sequences
/
5、使用序列
未使用NEXTVAL时情况
SQL> INSERT INTO dept1(deptno,dname,loc)
2 VALUES (dept_deptno.CURRVAL,'IT_DEPT','BEIJING')
3 /
VALUES (dept_deptno.CURRVAL,'IT_DEPT','BEIJING')
*
ERROR at line 2:
ORA-08002: sequence DEPT_DEPTNO.CURRVAL is not yet defined in this session
正确的用法
INSERT INTO dept1(deptno,dname,loc)
VALUES (dept_deptno.NEXTVAL,'IT_DEPT','BEIJING')
/
1 row created.
INSERT INTO dept1(deptno,dname,loc)
VALUES (dept_deptno.NEXTVAL,'HR_DEPT','SHANGHAI')
/
1 row created.
SELECT * FROM dept1;
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 IT_DEPT BEIJING
60 HR_DEPT SHANGHAI
6 rows selected.
未使用NEXTVAL时情况
SQL> INSERT INTO dept1(deptno,dname,loc)
2 VALUES (dept_deptno.CURRVAL,'IT_DEPT','BEIJING')
3 /
VALUES (dept_deptno.CURRVAL,'IT_DEPT','BEIJING')
*
ERROR at line 2:
ORA-08002: sequence DEPT_DEPTNO.CURRVAL is not yet defined in this session
正确的用法
INSERT INTO dept1(deptno,dname,loc)
VALUES (dept_deptno.NEXTVAL,'IT_DEPT','BEIJING')
/
1 row created.
INSERT INTO dept1(deptno,dname,loc)
VALUES (dept_deptno.NEXTVAL,'HR_DEPT','SHANGHAI')
/
1 row created.
SELECT * FROM dept1;
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 IT_DEPT BEIJING
60 HR_DEPT SHANGHAI
6 rows selected.
6、修改序列
ALTER SEQUENCE dept_deptno
INCREMENT BY 10
MAXVALUE 400
NOCACHE
NOCYCLE
/
Sequence altered.
ALTER SEQUENCE dept_deptno
INCREMENT BY 10
MAXVALUE 400
NOCACHE
NOCYCLE
/
Sequence altered.
7、删除序列
DROP SEQUENCE dept_deptno;
Sequence dropped.
DROP SEQUENCE dept_deptno;
Sequence dropped.
转载于:https://blog.51cto.com/19880614/1161901