zoukankan      html  css  js  c++  java
  • ORACLE SEQUENCE用法

    在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。 

    1、Create Sequence

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

        创建语句如下: 

     

    复制代码
    CREATE SEQUENCE seqTest
    INCREMENT BY 1 -- 每次加几个
    START WITH 1 -- 从1开始计数
    NOMAXvalue -- 不设置最大值
    NOCYCLE -- 一直累加,不循环
    CACHE 10--设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
    复制代码

     

     

    2、得到Sequence值 

    定义好sequence后,你就可以用currVal,nextVal取得值。
        CurrVal:返回 sequence的当前值 
        NextVal:增加sequence的值,然后返回 增加后sequence值 

      得到值语句如下:
    SELECT Sequence名称.CurrVal FROM DUAL; 

      如得到上边创建Sequence值的语句为:

    select seqtest.currval from dual

     

     

    在Sql语句中可以使用sequence的地方: 
        - 不包含子查询、snapshot、VIEW的 SELECT 语句 
        - INSERT语句的子查询中 
        - INSERT语句的values中 
        - UPDATE 的 SET中

    如在插入语句中

     

    insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入测试');

     

     

     注:

        - 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。

          CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。

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

     

     

     

     

    3、Alter Sequence 
        拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create。

     

    例:

    alter sequence SEQTEST maxvalue 9999999;
        另: SEQUENCE_CACHE_ENTRIES参数,设置能同时被cache的sequence数目。

     

    4、Drop Sequence
    DROP SEQUENCE seqTest; 

     

     

    5、一个例子

     

    复制代码
    create sequence SEQ_ID
    minvalue 1
    maxvalue 99999999
    start with 1
    increment by 1
    nocache
    order;

    建解发器代码为:

    create or replace trigger tri_test_id
      before insert on S_Depart   --S_Depart 是表名
      for each row
    declare
      nextid number;
    begin
      IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
        select SEQ_ID.nextval --SEQ_ID正是刚才创建的
        into nextid
        from sys.dual;
        :new.DepartId:=nextid;
      end if;
    end tri_test_id;
    复制代码

     

         OK,上面的代码就可以实现自动递增的功能了。

     

     

     

        注::new 代表 数据改变后的新值,相对应的有 :old 原值

              := 代表 赋值

              :nextid表示引用sqlplus中定义的变量

  • 相关阅读:
    14.18 InnoDB Backup and Recovery 备份和恢复:
    14.18 InnoDB Backup and Recovery 备份和恢复:
    php使用 _before_index() 来实现访问页面前,判断登录
    php使用 _before_index() 来实现访问页面前,判断登录
    查询方式实例演示
    查询方式实例演示
    haproxy timeout server 46000 后台超时时间
    haproxy timeout server 46000 后台超时时间
    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
  • 原文地址:https://www.cnblogs.com/For-her/p/3958227.html
Copyright © 2011-2022 走看看