zoukankan      html  css  js  c++  java
  • ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

    如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 

    sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者其他.


    1.创建序列 Create Sequence

    你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE 权限

    CREATE SEQUENCE CUX_DEMO_SEQUENCE
    MINVALUE 1
    MAXVALUE 99999999999
    START WITH 10000
    INCREMENT BY 1
    NOCYCLE
    CACHE 20
    ORDER ;

    注释:

    MINVALUE 1   --最小值
    MAXVALUE 99999999999   --最大值
    START WITH 10000   --起始数值
    INCREMENT BY 1   --每次增加1
    NOCYCLE    --一直累加不循环
    CACHE 20 --缓存
    ORDER ;

    还有一些其他参数,比如:

    NOMAXVALUE   --无最大值
    NOCACHE --不设置缓存

    如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。


    2.使用序列

    定义好SEQUENCE,你就可以用CURRVAL,NEXTVAL

    CURRVAL=返回 SEQUENCE的当前值

    NEXTVAL=增加SEQUENCE的值,然后返回 SEQUENCE 值

    EXAMPLE:

    CUX_DEMO_SEQUENCE.CURRVAL
    CUX_DEMO_SEQUENCE.NEXTVAL

    可以使用SEQUENCE的地方:

    - 不包含子查询、snapshot、VIEW的 SELECT 语句
    - INSERT语句的子查询中
    - NSERT语句的VALUES中
    - UPDATE 的 SET中

    可以看如下例子:

    INSERT INTO CUX_DEMO_TABLE VALUES
    (CUX_DEMO_SEQUENCE.NEXTVAL, 123 , 'IBAD' , 'MARK' ,'Y');

    SELECT CUX_DEMO_SEQUENCE.CURRVAL FROM DUAL;

    注意:

    第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENTBY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。


    3. 修改序列 ALTER SEQUENCE

    你或者是该SEQUENCE的owner,或者有ALTER ANY SEQUENCE 权限才能改动SEQUENCE. 可以alter除start至以外的所有SEQUENCE参数.如果想要改变start值,必须 DROP SEQUENCE 再 重新创建SEQUENCE .

    Alter SEQUENCE
    ALTER SEQUENCE CUX_DEMO_SEQUENCE
    INCREMENT BY 10
    MAXVALUE 10000
    CYCLE -- 到10000后从头开始
    NOCACHE ;


    影响SEQUENCE的初始化参数:

    SEQUENCE_CACHE_ENTRIES =设置能同时被cache的SEQUENCE数目。

    4.删除序列 DROP SEQUENCE

    可以很简单的Drop SEQUENCE

    DROP SEQUENCE CUX_DEMO_SEQUENCE;

    11g中对PL/SQL访问sequence的一个改进

    5.在pl/sql 代码中访问一个sequence

    在Oracle 11g之前,熟悉pl/sql编程的puber们都知道,当在pl/sql 代码中访问一个sequence的时候,一般的做法是,比如:
    DECLARE v_n  number;
    BEGIN
       SELECT Seq.Nextval INTO v_n FROM Dual;
       ....
    END;

    所以大家都觉得很烦琐,而且这么写有一定的性能上的开销,但是没办法,那么好了,到了11g,这个问题Oracle开发者为你排忧了。

    在11g中,重新修改了访问方法,不仅仅提高了运行效率而且在pl/sql中的调用方法也变的非常简单,在11g中,你可以简单的这样处理:
    DECLARE v_n NUMBER:=Seq.Nextval;
    BEGIN
       ....
    END;

  • 相关阅读:
    CF741C.Arpa’s overnight party and Mehrdad’s silent entering [构造 二分图染色]
    CF719E. Sasha and Array [线段树维护矩阵]
    洛谷7月月赛
    CF666B. World Tour
    BZOJ4668: 冷战 [并查集 按秩合并]
    水题练习 2
    CF715B. Complete The Graph
    关于最短路、负环、差分约束系统的一点笔记
    关于最小生成树,拓扑排序、强连通分量、割点、2-SAT的一点笔记
    hdu1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/arxive/p/6139465.html
Copyright © 2011-2022 走看看