2012-02-28 9 views
1

基本的に、ある列から複数のIDを選択し、それらのIDを使用してテーブルから削除する必要があります。DELETEで使用するSELECTから複数の値を格納しようとする

私はこのようなことをしようとしていますが、私が間違っているのか正しいボールパークにいるのかは分かりません。

--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のオプティマイザは、一時的なデータセットをキャッシュするenuffスマートだと思う

Ask Tom about temp tables and cursors

+2

を介して読むことを与えるでしょうし、ポイントには、それはトリックをした。 SQLは私の強い訴訟ではありませんが、私はそれを知っていたはずです。ありがとう! – Brian

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; 

EDIT:あなたは

  • オープンを削除したい値を持つカーソルを作成します

    1. :この問題のためのロジックは、このようにすることができit
    2. カーソルのすべての行を取得し始めます。
    3. fectでは、実際の行を削除します。

    文章のリンクという単語を使用してください。

    カーソルを使用して問題が発生した場合は、ここでは良いintroduction to Oracle 11g Cursorsです。さらに、このblog entryには、パラメータ付きのカーソルを使用する素晴らしい例があります。

  • +0

    私はカーソルとひどく慣れていないよ(「%ピーター%」のようなCustomerNameの受注FROM OrderIdでを選択します)。削除ステートメントの実行にどのような価値がありますか?編集:リンクに気づいていない、私は – Brian

    関連する問題