2012-02-28 39 views
1

好吧,基本上我需要從一列中選擇多個ID,然後使用這些ID從表中刪除。試圖從一個SELECT中存儲多個值以便在DELETE中使用

目前我正在嘗試做這樣的事情,但我不確定自己是否做錯了事,甚至在正確的場地上。

--this will return multiple rows 
select user_group_user_id, user_group_id 
bulk collect into USERGROUPUSERID, USERGROUPID 
from user_group_user_tab 
where user_id = USERID; --USERID is argument passed in 

--Attemting to delete multiple rows where the above results are found 
delete from user_group_user_tab 
where user_group_user_id in USERGROUPUSERID; 

delete from user_group_tab 
where user_group_id in USERGROUPID; 

這是Oracle(11g)中存儲過程的所有部分。 USERGROUPUSERID和USERGROUPID在之前聲明。

任何人都有如何做到這一點的建議?我不確定是否需要批量收集,或者是否有完全不同的方法,或者我只是錯了。

謝謝!

回答

3

我通常會使用

BEGIN TRANS 
delete from OrderItems where OrderId in (SELECT OrderId FROM Orders WHERE CustomerName like '%peter%'); 
DELETE FROM Orders WHERE CustomerName like '%peter%'; 
COMMIT; 

即剛剛超過子查詢結果運行刪除。按照「ask tom」的臨時表不像oracle中那樣使用,每行的光標比簡單的連接慢得多。在它的上面我認爲Oracle優化器是智能句話之後B緩存臨時數據集(SELECT的OrderId從接單到WHERE LIKE「%彼得%」客戶名稱)

Ask Tom about temp tables and cursors

+2

簡單和重點,它的伎倆。 SQL不是我的強項,但我覺得我應該知道這一點。謝謝! – Brian 2012-02-28 16:54:27

1

您可以使用光標來檢索所有值並使用WHERE CURRENT OFsentence

你的光標會是這樣的:

cursor c1 (USERID number(10)) 
    is 
    select user_group_user_id, user_group_id 
    from user_group_user_tab 
    where user_id = USERID 
    for update of user_group_user_tab; 

編輯:針對此問題的邏輯可能是這樣的:

  1. 與要刪除
  2. 打開值創建光標它
  3. 開始獲取光標的每一行。
  4. 在該事件中,刪除實際的行。

關於這句話的鏈接單詞可以幫助你做到這一點。

如果您在使用遊標時遇到問題,請點擊此處introduction to Oracle 11g Cursors。另外,這blog entry有一個很好的例子,使用帶參數的遊標。

+0

我並不十分熟悉的光標。我使用什麼價值來運行刪除語句?編輯:沒有注意到的鏈接,我會給那一個通過 – Brian 2012-02-28 16:11:23

相關問題