2017-05-21 72 views
0

我正在使用存儲過程從Available_Tickets表中選擇一個「隨機」行,選擇後如果用戶喜歡該數字,併購買票據,該行將爲從表中刪除。PL/SQL過程數據凍結(保留隨機抽獎券)

我的過程是這樣的:

CREATE OR REPLACE GET_RANDOM_TICKET (RESULT OUT INTEGER) IS 
co,mn,mx integer; 
BEGIN 
SELECT COUNT(ID) , MIN(ID) ,MAX(ID) INTO CO,MN,MX FROM TICKETS; 

SELECT TICKET_NUMBER INTO RESULT FROM (
    SELECT TICKET_NUMBER 
     FROM TICKETS WHERE ID >= DBMS_RANDOM(MN,MX) 
) WHERE ROWNUM = 1; 
END GET_RANDOM_TICKET; 

如果用戶同意對返回的數所選擇的行被刪除。 我可以得到一個最壞的情況下,在執行第一個select語句之後,max(id)行被刪除嗎?

編輯1 ---- 這兩個SELECT語句會不顧表中的變化而看到相同的數據?爲什麼?

回答

0

我會重新設計如下 1)增加一列(票狀態[免費,保留,出售])來標記返回的票證爲保留,直到用戶確認他的選擇 2)使用遊標具有用於更新子句在將其返回給用戶後更新該票狀態列 - 還添加免費票的條件 3)在用戶確認後再次檢查票狀態,如果它仍然保留,則更新爲出售。 (在2個用戶同時運行該程序並獲得相同號碼的非常渺茫的機會中,其中一個將獲得該號碼,另一個應該接收到錯誤消息,因爲該票不再保留。

希望幫助

+0

請問您可以在答案中添加一些代碼,我希望您注意,刪除是在程序之外完成的,所以如果我將其更改爲更新,並在程序中選擇'for update',那麼保持鎖? – alibttb

+0

對不起,你不需要刪除,你可以將它保存爲未來引用的狀態,正如我之前提到的,你可以根據你的條件狀態來確定票狀態 –