2009-12-19 129 views
1

我有這樣的要求:我必須使用存儲過程從Oracle表中選擇一定數量的記錄。我將捕獲ref遊標中的整個結果集,但同時我必須更新選定記錄中的標誌(存儲在ref遊標中的標誌)。在oracle存儲過程中觸發

所以我想知道這在存儲過程中是否可行。如果是,那麼我需要使用什麼,例如觸發?

在此先感謝

+0

我們需要更多關於您的需求的細節?您是否想要將更改的列包含在結果集中?在返回結果集之前是否希望提交更改?或者只有在記錄處理完畢後纔會更新標誌? – APC 2009-12-19 09:41:35

+0

感謝您的快速回復。這裏是我的詳細需求 實際上表中的記錄數量非常高,所以我在循環中調用存儲過程,並且在每次迭代中我都選擇了一組記錄。現在爲了避免重複的記錄選擇,我一旦選擇記錄就更新標記,以便在下一次迭代中不選擇它們。 希望我有克利提到我的要求。只是想確保我們可以在存儲過程中做到這一點,如果是的話,那麼我可以花一些時間在其上..或者想到另一種方法 – Kapil 2009-12-19 09:51:58

+0

你需要返回一個參考光標還是處理行該存儲過程? – 2009-12-19 09:54:46

回答

1

光標不「捕獲」或「商店」任何東西。要存儲某些內容,請使用PL/SQL表。 可能是最接近的事情你想做的事:

DECLARE 
    type t_foobar is table of foobar; 
    v_foobar t_foobar; 
BEGIN 
    UPDATE foobar SET flag=1 WHERE foo=bar AND flag=0 AND rowum<=10; 
    SELECT * FROM foobar BULK SELECT INTO v_foobar WHERE flag=1; 
    UPDATE foobar SET flag=2 WHERE flag=1; 
    COMMIT; 
    /* process v_foobar here */ 
END; 

我在這裏做了兩次更新,以便使併發環境中,每個會話選擇UND更新不同的行。 (例如,對於飛機座位預訂系統)

+0

我有一個疑問,如果前10行已經被標記並且不需要被選中,這個rownum的概念是否會起作用 – Kapil 2009-12-19 10:08:07

+0

是的,這就是'AND flag = 0'的意思。它只返回尚未處理的行。確保在該標誌欄上放置索引,並考慮錯誤處理。如果您的處理在所提供的版本中失敗,您將不會再找到失敗的行... – 2009-12-19 10:29:18

+0

Vivek:rownum過濾器由Oracle在每隔一個過濾器之後應用,所以不用擔心。 – 2009-12-19 12:19:55

0

參考遊標是不可修改的,因爲它們只存在於內存中。如名稱所示,它們是參考。您將不得不分別執行更新。

+0

大家好, 再次解釋我的要求: 我有一個包含幾千條記錄的表。我必須處理所有這些記錄,但我無法同時處理所有記錄,我一次只能處理1000條記錄。所以我正在使用一個存儲過程並在循環中調用相同。現在爲了避免再次獲取重複的記錄,我正在更新我在一次迭代中選擇的所有記錄的標誌,這就是爲什麼我必須更新存儲過程中選擇的所有記錄。 – Kapil 2009-12-20 13:15:18

1

首先,您不會「捕獲ref遊標中的整個結果集」,ref遊標是指向結果集的指針。實際上,你要返回的是一個查詢,它將通過接受它的任何東西執行(或技術上可能)。

我會忘記參考光標,並去pipelined table function。這樣程序可以處理記錄(即將它們標記爲已更新),因爲它將它們返回給調用者。