2010-09-01 41 views
1

在Oracle具體的開始,我們可以做到這一點是這樣的:創建DB2序列與價值

declare current_max_value NUMBER; 
begin select last_number+1 into current_max_value from USER_SEQUENCES where sequence_name = 'HIBERNATE_SEQUENCE'; 
execute immediate 'CREATE SEQUENCE SEQ__NEW_SEQUENCE MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH '||current_max_value|| ' CACHE 20 NOORDER NOCYCLE'; 

是否有DB2等同?

+0

請標記答案。我已經發布它很久了 – 2013-01-03 11:11:36

回答

4

DB2具有非常類似的功能。

如果你只是需要生成uninque鍵則: -

CREATE TABLE MYTABLE (
    GENERATED_KEY     BIGINT 
     GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 100), 
    MY_DATA       VARCHAR(1000) ........... 

在創建表的語句將做到這一點沒有太過計較。任何時候在插入時遇到空值時都會生成一個新的數字。

如果你需要一個實際的序列號在幾個表來使用,那麼:

CREATE SEQUENCE ORG_SEQ 
START WITH 1 
INCREMENT BY 1 
NO MAXVALUE 
NO CYCLE 
CACHE 24 

將定義你想在你的下一個號碼SQL中的順序,那麼你在任何地方使用「NEXTVAL」的文章:

NEXTVAL FOR ORG_SEQ 
+1

對不起,但這不符合我的要求。我需要創建具有特定起始值的序列,以便現有表可以使用新序列(因爲現有數據,我無法在1處開始序列),並且每個表都必須使用不同的序列,因此不會有任何「跳躍」號碼。 – Blake 2010-09-08 14:23:18

+0

你可以在這裏找到RTFM http://publib.boulder.ibm.com/infocenter/db2luw/v9//index.jsp。看看「標識選項」語法,你會發現一個「STARTS WITH」子句。此外,對於您對連續序列的要求,您需要設置'NO CAHCE'選項,但請注意,這將有效地「單線程」對錶格進行任何更新。 – 2010-09-09 01:12:28

+0

如果我們可以知道如何在DB2中執行動態sql語句,那麼我們可以解決這個問題 – 2012-10-19 09:24:34

0

很大的困難後,我能夠與DB2語法圖了這一點,並在這裏我們去

CREATE PROCEDURE SEQ_NAME
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN ATOMIC
DECLARE MAX_VAL_NO INTEGER;
SELECT MAX(COL_NAME)+1 INTO MAX_VAL_NO FROM TABLE_NAME;
execute immediate 'CREATE SEQUENCE SEQ_NAME NO MAXVALUE NO CYCLE START WITH '|| MAX_VAL_NO;
END
GO

可以在任何一個可以告訴我,我們爲什麼要使用LANGUAGE SQLDYNAMIC RESULT SETS 1

什麼是這裏使用的語法,坦白說我真的沒有一個想法,但我打它通過試錯法。急切地想知道什麼是ANSI C或其他語法。

欣賞如果你能回答這個問題。 (不正規的IBM鏈接

+0

你需要「 LANGUAGE SQL「作爲用C,Java或PL/1編寫的DB2支持過程。 「DYNAMIC RESULT SETS n」是優化器告訴DB2你只希望從該過程返回n行的提示。在較舊版本的DB2中,如果返回的行較少,則會發生錯誤。 – 2012-11-13 03:10:04

+0

oh gr8 James這真的很有幫助。 :) – 2012-11-16 11:59:04