序列參照

使用指定順序名稱的 NEXT VALUE 和 PREVIOUS VALUE 表示式來參照順序。

序列參照
讀取語法圖跳過視覺化語法圖nextval-表示式prevvval-expression
nextval-expression
讀取語法圖跳過視覺化語法圖NEXT VALUEFOR序列名稱
prevvval-expression
讀取語法圖跳過視覺化語法圖PREVIOUS VALUEFOR序列名稱

使用指定順序名稱的 NEXT VALUE 和 PREVIOUS VALUE 表示式來參照順序。

nextval-expression
NEXT VALUE 表示式會產生並傳回指定序列的下一個值。 當 NEXT VALUE 表示式指定順序的名稱時,會產生順序的新值。 不過,如果有多個 NEXT VALUE 表示式實例在查詢內指定相同的順序名稱,則對於結果的每一列,順序值只會增量一次,且 NEXT VALUE 的所有實例都會針對結果的一列傳回相同的值。 NEXT VALUE 是具有外部動作的非固定表示式,因為它會導致序列值增量。

當產生序列的下一個值時,如果超出遞增序列的最大值或序列邏輯範圍的遞減序列的最小值,且 NO CYCLE 選項生效,則會傳回錯誤。

NEXT VALUE 表示式結果的資料類型及長度屬性與指定的順序相同。 結果不能是空值。

prevvval-expression
「前一個值」表示式會針對現行應用程式程序內前一個陳述式的指定順序,傳回最近產生的值。 可以使用 PREVIOUS VALUE 表示式並指定序列名稱來反覆地參照此值。 在單一陳述式內可能有多個指定相同序列名稱的 PREVIOUS VALUE 表示式實例,且它們都傳回相同的值。

只有在現行應用程式程序中已參照指定相同序列名稱的 NEXT VALUE 表示式時,才能使用 PREVIOUS VALUE 表示式。

PREVIOUS VALUE 表示式結果的資料類型及長度屬性與所指定順序的資料類型及長度屬性相同。 結果不能是空值。

sequence-name
識別要參照的順序。 sequence-name 必須識別存在於現行伺服器上的序列。

附註

授權: 如果在陳述式中參照順序,則陳述式授權 ID 所保留的專用權必須至少包括下列其中一項:

  • 對於陳述式中所識別的順序,
    • 順序的 USAGE 專用權,以及
    • 包含順序之綱目的 USAGE 專用權
  • 資料庫管理者權限

如需對應於 SQL 專用權之系統權限的相關資訊,請參閱 檢查順序的專用權時對應的系統權限

使用 NEXT VALUE 產生值: 當為序列產生值時,會耗用該值,下次要求值時,會產生新值。 即使包含 NEXT VALUE 表示式的陳述式失敗或已回復,也是如此。

前一個值的範圍: 前一個值會持續保存,直到針對現行階段作業中的順序產生下一個值、捨棄或變更順序,或應用程式階段作業結束為止。 該值不受 COMMIT 或 ROLLBACK 陳述式影響。 無法直接設定 PREVIOUS VALUE 的值,這是對順序執行 NEXT VALUE 表示式的結果。

通常用於管理一組連線並將交易遞送至任意連線的應用程式或產品,尤其是效能的技術。 在這些狀況下,序列的 PREVIOUS VALUE 可用性應該只在交易結束之前才會依據。

用作唯一索引鍵值: 透過使用第一列的 NEXT VALUE 表示式 (這會產生序列值) 及其他列的 PREVIOUS VALUE 表示式 (PREVIOUS VALUE 實例參照現行階段作業中最近產生的序列值) 來參照序號,可以使用相同的序號作為兩個個別表格中的唯一索引鍵值,如下所示:

  INSERT INTO ORDER (ORDERNO, CUSTNO)
    VALUES (NEXT VALUE FOR ORDER_SEQ, 123456)

  INSERT INTO LINE_ITEM (ORDERNO, PARTNO, QUANTITY)
    VALUES (PREVIOUS VALUE FOR ORDER_SEQ, 987654, 1)

容許使用 NEXT VALUE 及 PREVIOUS VALUE: 可在下列位置指定 NEXT VALUE 及 PREVIOUS VALUE 表示式:

  • 在 SELECT 陳述式或 SELECT INTO 陳述式的 select 子句 內,只要陳述式不包含 DISTINCT 關鍵字、GROUP BY 子句、ORDER BY 子句、UNION 關鍵字、INTERSECT 關鍵字或 EXCEPT 關鍵字
  • fullselect 的 VALUES 子句內 (不接受 NEXT VALUE)
  • 在 INSERT 陳述式的 VALUES 子句內
  • 在 INSERT 陳述式全選的 select-clause
  • 在已搜尋或已定位 UPDATE 陳述式的 SET 子句內,雖然無法在 SET 子句中表示式次選取的 select-clause 中指定 NEXT VALUE
    可以在 UPDATE 陳述式的 SET 子句中的任何位置指定 PREVIOUS VALUE 表示式,但只有在 SET 子句中,才能指定 NEXT VALUE 表示式 (如果它不在表示式全選的 select-clause 內)。 例如,支援使用下列順序表示式:
      UPDATE T SET C1 = (SELECT PREVIOUS VALUE FOR S1 FROM T)
    
      UPDATE T SET C1 = PREVIOUS VALUE FOR S1
    
      UPDATE T SET C1 = NEXT VALUE FOR S1
    
    不支援使用下列序列表示式:
      UPDATE T SET C1 = (SELECT NEXT VALUE FOR S1 FROM T)
    
  • assignment-statement內,除非在表示式 fullselectselect-clause 內。 支援使用下列順序表示式:
      SET :ORDERNUM = NEXT VALUE FOR INVOICE
    
      SET :ORDERNUM = PREVIOUS VALUE FOR INVOICE
    
    不支援使用下列序列表示式:
      SET :X = (SELECT NEXT VALUE FOR S1 FROM T)
    
      SET :X = (SELECT PREVIOUS VALUE FOR S1 FROM T)
    
  • 在 VALUES 或 VALUES INTO 陳述式內,但不在表示式全選的 select-clause
  • 在 CREATE PROCEDURE 陳述式的 SQL-routine-body
  • 在 CREATE TRIGGER 陳述式的 SQL-trigger-body 內 (不接受 PREVIOUS VALUE)
  • 在 CALL 陳述式的引數清單內。
  • 在 CREATE PROCEDURE 或 CREATE FUNCTION 的預設表示式內。 預設值包含 NEXT VALUE 或 PREVIOUS VALUE 的函數只能在可以直接指定 NEXT VALUE 或 PREVIOUS VALUE 的位置中使用。

使用 NEXT VALUE 及 PREVIOUS VALUE 的限制: NEXT VALUE 及 PREVIOUS VALUE 表示式不能在下列位置指定:

  • 在 CREATE TABLE 或 ALTER TABLE 陳述式中的具體化查詢表格定義內
  • 在 CHECK 限制內
  • 在視圖定義內
  • 在 CREATE INDEX 陳述式內
  • 在 CREATE FUNCTION 陳述式的 SQL-routine-body

此外,無法在下列位置指定 NEXT VALUE 表示式:

  • CASE表示式
  • 聚集函數的參數清單
  • 非明確容許的環境定義中的子查詢
  • 外部 SELECT 包含 DISTINCT 運算子或 GROUP BY 子句的 SELECT 陳述式
  • 使用 UNION、INTERSECT 或 EXCEPT 運算子將外部 SELECT 與另一個 SELECT 陳述式結合的 SELECT 陳述式
  • 包含 OFFSET 子句的 SELECT 陳述式。
  • 結合的結合條件
  • 巢狀表格表示式
  • 表格函數的參數清單
  • UPDATE 陳述式 SET 子句中表示式全選的 select-clause
  • 最外層 SELECT 陳述式或 DELETE 或 UPDATE 陳述式的 WHERE 子句
  • 最外層 SELECT 陳述式的 ORDER BY 子句
  • IF、WHILE、DO... SQL 常式中的 UNTLE 或 CASE 陳述式

將順序表示式與游標搭配使用: 通常, SELECT NEXT VALUE FOR ORDER_SEQ FROM T1 會產生一個結果表格,其中包含與從 T1擷取的列數一樣多的順序 ORDER_SEQ 產生值。 游標 SELECT 陳述式中 NEXT VALUE 表示式的參照會參照針對結果表格橫列所產生的值。 每次擷取橫列時,都會為 NEXT VALUE 表示式產生順序值。

如果在 DRDA 環境中的用戶端執行封鎖,則在處理應用程式的 FETCH 陳述式之前,可能會在 Db2® 伺服器上產生順序值。 如果用戶端應用程式未明確 FETCH 所有已從資料庫擷取的列,則應用程式將永遠不會看到所有那些產生的序列值 (與未 FETCHed 的列數一樣多)。 這些值可能構成序列中的間隙。

游標之 SELECT 陳述式中的 PREVERIC VALUE 表示式的參照會在 OPEN 時評估。 換句話說,游標之 SELECT 陳述式中的 PREVERIC VALUE 表示式參照此應用程式程序針對游標開啟之前的指定順序所產生的最後一個值。 在 OPEN 時評估之後,游標主體內的 PREVIOUS VALUE 所傳回的值將不會從 FETCH 變更為 FETCH ,即使在游標主體內呼叫 NEXT VALUE 也是如此。 關閉游標之後, PREVIOUS VALUE 的值會是應用程式程序所產生的最後一個 NEXT VALUE。

替代語法: 關鍵字 NEXTVAL 和 PREVVAL 可分別作為 NEXT VALUE 和 PREVVALUE 的替代關鍵字。

範例

  • 假設有一個稱為 ORDER 的表格,且建立名為 ORDER_SEQ 的序列如下:
      CREATE SEQUENCE ORDER_SEQ
        START WITH 1
        INCREMENT BY 1
        NO MAXVALUE
        NO CYCLE
        CACHE 24
    以下是如何使用 NEXT VALUE 表示式來產生 ORDER_SEQ 序號的一些範例:
      INSERT INTO ORDER (ORDERNO, CUSTNO)
        VALUES (NEXT VALUE FOR ORDER_SEQ, 123456)
    
      UPDATE ORDER
        SET ORDERNO = NEXT VALUE FOR ORDER_SEQ
        WHERE CUSTNO = 123456
    
      VALUES NEXT VALUE FOR ORDER
        INTO :HV_SEQ