2010-06-30 36 views
2

,我有以下表中它的價值501 ..SQL存儲過程 - 請幫我寫下這個! (部分2)

CREATE TABLE _Numbers(
    Number numeric(20,0) NOT NULL PRIMARY KEY 
) 
INSERT INTO _Numbers VALUES(501) 

我怎麼能寫這樣一個存儲過程返回我501遞增順序下一個數(即502) ?我希望每當存儲過程被調用時重複這種行爲。

(另外,我怎麼能叫任何查詢這個存儲過程?)我剛纔的問題3151056

部分。

感謝,

巫毒

回答

1
CREATE OR REPLACE PROCEDURE read_and_increment (number_just_read OUT NUMBER) 
IS 
BEGIN 
    DECLARE 
     stored_number NUMBER DEFAULT NULL; 
    BEGIN 
     SELECT number 
     INTO stored_number 
     FROM _numbers 
     WHERE ROWNUM = 1; 

     number_just_read := stored_number; 

     UPDATE _numbers 
     SET number = number + 1; 

     COMMIT; 
    END; 
END read_and_increment; 
+0

我假設_NUMBERS表只包含一個有意義的記錄,並且我們沒有併發問題(即同時讀取等)。 – UltraCommit 2010-06-30 17:08:49

+1

@Chicken :) - >不用這張表我們不會有併發問題。但是如果同時讀取會發生什麼?數據庫會話不會被線程鎖定,另一個線程只是在等待它? (如果這是一種noob問題,則爲sry) – VoodooChild 2010-06-30 17:11:55

+1

在一微秒內,兩個用戶可以讀取(並在輸出中生成)相同的值,將NUMBER字段遞增兩次。 – UltraCommit 2010-06-30 17:13:20

3

使用IDENTITY列該負責編號和增加你的。

返回的任何數量的容易被已經被另外一個連接/客戶/過程

+1

我不認爲我可以在我的情況下使用IDENTITY,因爲我正在將數據從安靜的一些舊錶中移出,其中一些具有此編號以供使用,其中一些爲NULL。請參閱我以前發佈的問題,瞭解我想要做什麼http://stackoverflow.com/questions/3151056/sql-stored-proc-help-me-write-this-one-please - 感謝您的回答 – VoodooChild 2010-06-30 17:09:18

2

你從舊錶導入數據,對不對? 如果從舊錶格中導入數據並關閉身份,那麼您將身份設置爲最高數字+ 1,並使用身份繼續您的生活。

其他方法是在插入時使用觸發器,它將檢查NumberItem是否爲null,如果它爲null,則會添加Max + 1。如果沒有,什麼都不要做。

我不認爲SP是一個很好的解決方案。我很確定你不需要這些東西。