欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          Oracle的序列SEQUENCE解析

          本篇文章給大家?guī)砹岁P于Oracle的相關知識,詳細講解了Oracle中的序列SEQUENCE,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,希望對大家有幫助。

          Oracle的序列SEQUENCE解析

          推薦教程:《Oracle視頻教程》

          一、序列介紹

          Oracle的序列是一種數(shù)據(jù)庫對象,主要作用是用來產(chǎn)生唯一值。序列被創(chuàng)建以后可以通過數(shù)據(jù)字典找到序列對象,因此序列可以被多個對象共享。

          二、創(chuàng)建序列

          序列使用CREATE SEQUENCE語法進行創(chuàng)建:

          CREATE SEQUENCE sequence  [INCREMENT BY n]  [START WITH n]  [{MAXVALUE n | NOMAXVALUE}]  [{MINVALUE n | NOMINVALUE}]  [{CYCLE | NOCYCLE}]  [{CACHE n | NOCACHE}];
          • NCREMENT BY:用于定義序列的步長,如果省略,則默認為1,如果是負值,則代表序列的值是遞減的。
          • START WITH:定義序列的初始值(即產(chǎn)生的第一個值),默認為1。
          • MAXVALUE:定義序列能生成的最大值。NOMAXVALUE是默認選項,代表沒有最大值,這時,對于遞增序列,系統(tǒng)能夠產(chǎn)生的最大值是10的27次方;對于遞減序列,最大值是-1。
          • MINVALUE:定義序列能生成的最小值。NOMINVALUE是默認選項,代表沒有最小值,這時,對于遞減序列,系統(tǒng)能夠產(chǎn)生的最小值是負的10的26次方;對于遞減序列,最小值是1。
          • CYCLE和NOCYCLE:表示當序列生成器的值達到限制后是否循環(huán)。如果循環(huán),當遞增序列達到最大值時,循環(huán)到最小值;對于遞減序列,達到最小值時,循環(huán)到最大值。如果不循環(huán),達到限制值后,繼續(xù)產(chǎn)生新值就會發(fā)生錯誤。
          • CACHE:定義存放序列的內(nèi)存塊的大小,默認為20。NOCACHE表示不對序列進行內(nèi)存緩沖。對序列進行內(nèi)存緩沖,可以改善序列的性能。

          例如:

          CREATE SEQUENCE invoice_seq INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;

          三、查詢序列

          一旦序列被創(chuàng)建,序列的創(chuàng)建代碼就被文本化在數(shù)據(jù)字典中,可以在user_objects數(shù)據(jù)字典中看到,如:

          SELECT object_name,object_id,object_type  FROM user_objects WHERE object_name = 'INVOICE_SEQ';

          在user_sequences表中保存了序列明細信息:

          SELECT sequence_name, min_value, max_value, increment_by, last_number  FROM user_sequences;

          四、使用序列

          NEXTVAL和CURRVAL偽列

          • NEXTVAL:返回下一個可用的序列值,它每次返回一個唯一的被引用值,實際對不同的用戶也是如此。當使用sequence.NEXTVAL時,一個新的序列數(shù)被產(chǎn)生并且當前的序列數(shù)被放入CURRVAL。
          • CURRVAL:獲得當前的序列值。在首次使用NEXTVAL之前就使用CURRVAL的話,會報錯。

          使用如下 :

          SELECT invoice_seq.CURRVAL,invoice_seq.NEXTVAL FROM DUAL;  INSERT INTO invoice  (invoice_id, vendor_id, invoice_number, invoice_total  )       VALUES (invoice_seq.NEXTVAL, 10, 'INV' || invoice_seq.CURRVAL, 100  );

          可以在下面的上下文中使用NEXTVAL和CURRVAL:

          • 不是子查詢的一部分的SELECT語句的字段列表。
          • INSERT語句中子查詢的SELECT列表。
          • INSERT語句中的VALUES子句。
          • UPDATE語句中的SET子句。

          不能再以下的上下文中使用NEXTVAL和CURRVAL:

          • 視圖的SELECT列表。
          • 帶DISTINCT的SELECT語句。
          • 帶GROUP BY、HAVING或ORDER BY子句的SELECT語句。
          • 在SELECT、DELETE或UPDATE語句中的子句。
          • 在CREATE TABLE或ALTER TABLE語句中的DEFAULT表達式。

          另外要注意,ROLLBACK并不能使序列值回滾。

          五、修改序列

          如:

          ALTER SEQUENCE invoice_seq     INCREMENT BY 2 MAXVALUE 10   NOCACHE  NOCYCLE;

          修改序列時,有如下幾個限制:

          • 不能該表序列的起始值。
          • 最小值不能大于當前值。
          • 最大值不能小于當前值。
          • 修改后的序列規(guī)則不會影響以前的序列值,只有未來的序列值會受到影響。
          • 用戶必須具有ALTER SEQUENCE的權(quán)限。

          六、刪除序列

          DROP SEQUENCE invoice_seq;

          七、創(chuàng)建自增序列

          1、創(chuàng)建一個序列

          create sequence sq_recid  minvalue 1 maxvalue 999999  increment by 1   start with 1 noCYCLE;

          2、創(chuàng)建一個觸發(fā)器

          create or replace trigger  trg_test   before  insert on test for each row begin   select sq_recid.nextval into :new.ID from dual; end;  alter  trigger trg_test  enable;

          3、在C#中也可以手工插入序列到表中

          string sql="insert into test(ID,otherCol)value (Sql_recid.nextval,***)     retuing ID into :ID"

          推薦教程:《Oracle視頻教程》

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號