tinguo002

           

          ORACLE SEQUENCE用法

          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中定義的變量

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



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

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

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 光山县| 门源| 双辽市| 武陟县| 沂南县| 广州市| 孟津县| 榆树市| 加查县| 普定县| 长治市| 鹰潭市| 鄂托克前旗| 凤庆县| 太谷县| 乐平市| 穆棱市| 江达县| 榕江县| 八宿县| 常宁市| 凌源市| 中西区| 广南县| 温州市| 靖边县| 博爱县| 米泉市| 宁津县| 手游| 十堰市| 沿河| 临澧县| 拉孜县| 大同市| 青冈县| 鄄城县| 潜江市| 台东市| 明光市| 永泰县|