tinguo002

           

          ORACLE SEQUENCE用法

          ORACLE SEQUENCE用法

          在oracle中sequence就是序號,每次取的時候它會自動增加。sequence與表沒有關系。

          1、Create Sequence

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

              創(chuàng)建語句如下:

          復制代碼
          CREATE SEQUENCE seqTest
          INCREMENT
          BY 1 -- 每次加幾個
          START WITH 1 -- 從1開始計數
          NOMAXvalue -- 不設置最大值
          NOCYCLE -- 一直累加,不循環(huán)
          CACHE 10; --設置緩存cache個序列,如果系統(tǒng)down掉了或者其它情況將會導致序列不連續(xù),也可以設置為---------NOCACHE
          復制代碼

          2、得到Sequence值

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

            得到值語句如下:
          SELECT Sequence名稱.CurrVal FROM DUAL;

            如得到上邊創(chuàng)建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;

          建解發(fā)器代碼為:

          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正是剛才創(chuàng)建的
              into nextid
             
          from sys.dual;
              :new.DepartId:
          =nextid;
           
          end if;
          end tri_test_id;
          復制代碼

              OK,上面的代碼就可以實現自動遞增的功能了。

              注::new 代表 數據改變后的新值,相對應的有 :old 原值

                    := 代表 賦值

                    :nextid表示引用sqlplus中定義的變量

                                                                  參考文檔:http://www.cnblogs.com/scottckt/archive/2011/09/20/2182168.html



          歡迎大家訪問我的個人網站 萌萌的IT人

          posted on 2013-12-02 13:56 一堣而安 閱讀(294) 評論(0)  編輯  收藏 所屬分類: oracle

          導航

          統(tǒng)計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鄂温| 普格县| 嘉禾县| 南江县| 杂多县| 凤凰县| 英超| 凤山县| 马龙县| 牡丹江市| 新乡县| 阿克陶县| 佛山市| 吴川市| 剑河县| 黄平县| 蓝山县| 连江县| 五大连池市| 察雅县| 仁寿县| 衡山县| 仪陇县| 郎溪县| 克什克腾旗| 华安县| 应用必备| 万州区| 邵武市| 个旧市| 阜南县| 温宿县| 顺昌县| 砚山县| 社会| 平邑县| 防城港市| 房山区| 昔阳县| 五常市| 建昌县|