ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE SEQUENCE

ORACLE SEQUENCE

原创 Linux操作系统 作者:victorymoshui 时间:2012-02-07 16:45:55 0 删除 编辑

ORACLE SEQUENCE(序列)序列是用户创建的数据库对象,他可以有多个用户共享,用来生成唯一的整数。sequence属于某个用户。

序列号的存储和生成与表无关,因此,同一个序列可以用于多个表。但这样会引起应用的很多麻烦,因此,建议每个表都是用一个sequence(序列)

序列特性:
1、自动生成唯一编号
2、是一个可共享的对象
3、通常用于创建主键值
4、替换应用程序代码
5、如果将序列高速缓存到内存中,则可以提高访问序列值的效率
创建序列语法
CREATE SEQUENCE sequence
                 [START WITH n]
                 [INCREMENT BY n]
                 [{MAXVALUE n | NOMAXVALUE}]
                 [{MINVALUE n | NOMINVALUE}]
                 [{CYCLE | NOCYCLE}]
                 [{CACHE n | NOCACHE}];
EX:
CREATE SEQUENCE employee_seq
                 START WITH 10000
                 INCREMENT BY 1
                 NOMAXVALUE
                 NOCYCLE
                 NOCACHE;
说明:如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号,比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
序列相关数据字典   
USER_OBJECTS  
USER_SEQUENCES
EX:
SQL> SELECT object_name,object_name,status      
FROM user_objects      
WHERE lower(object_name)='employee_seq';
OBJECT_NAME       OBJECT_NAME            STATUS
-------------------------- ---------------------------- --------------
EMPLOYEE_SEQ     EMPLOYEE_SEQ            VALID
SQL> SELECT * FROM user_sequences  
2  WHERE LOWER(SEQUENCE_NAME)='employee_seq';
SEQUENCE_NAME   MIN_VALUE MAX_VALUE INCREMENT_BY CY OR CACHE_SIZE LAST_NUMBER
--------------------------- ------------------ ----------------- ----------------------- ----- ----- ----------------------------- ----------------------
EMPLOYEE_SEQ                           1 1.0000E+27                              1     N    N                                      20                10020
NEXTVAL和CURRVAL伪列
1、NEXTVAL会返回下一个可用的序列值。
2、CURRVAL会获得当前序列值。
3、第一次使用时必须对序列发出NEXTVAL,然后CURRVAL才能包含值,否则,oracle会抛出ORA-08002: sequence EMPLOYEE_name.CURRVAL is not yet defined in this session
EX:
SQL> SELECT employee_seq.nextval FROM dual;
NEXTVAL
-------------
      10000
SQL> SELECT employee_seq.currval FROM dual;  
CURRVAL
---------------
         10000
使用NEXTVAL和CURRVAL的规则
可以在以下情况下使用:
1、不属于子查询一部分的SELECT 语句的SELECT 列表。
2、INSERT 语句中的子查询的SELECT 列表。
3、INSERT 语句的VALUES 子句。
4、UPDATE 语句的SET 子句。
不能再以下情况下使用:
1、视图的SELECT 列表。
2、带有DISTINCT关键字的SELECT 语句。
3、带有GROUP BY 、HAVING或ORDER BY 子句的SELECT 语句。
4、SELECT、DELETE或UPDATE语句中的子查询。
5、CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式。
修改序列语法
ALTER SEQUENCE sequence
              [INCREMENT BY n]
              [{MAXVALUE n | NOMAXVALUE}]
              [{MINVALUE n | NOMINVALUE}]
              [{CYCLE | NOCYCLE}]
              [{CACHE n | NOCACHE}];
修改序列的说明
1、对序列具有ALTER权限。
2、修改只会影响以后发生的序列号。
3、如果要从不同的序号处重新开始,则不行删除原有的序列然后重新创建。
4、系统会执行一些验证操作。如:系统无法强加一个小于当前序号的新MAXVALUEF。否则抛出ORA-04009: MAXVALUE cannot be made to be less than the current value。
删除序列语法
DROP SEQUENCE sequence;
需要具备DROP (ANY) SEQUENCE权限。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9390331/viewspace-715767/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-08-26

  • 博文量
    173
  • 访问量
    298402