尝试存储SELECT中的多个值以在DELETE中使用

时间:2012-02-28 15:53:10

标签: sql oracle

好的,基本上我需要从一列中选择多个ID,然后使用这些ID从表中删除。

目前我正在尝试做类似这样的事情,但我不确定我是做错了什么,甚至不是在正确的球场。

--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在早些时候宣布。

任何人都有关于如何做到这一点的一些建议?我不确定这种批量收集是否可行,或者是否有完全不同的方法,或者我是否只是错误。

谢谢!

2 个答案:

答案 0 :(得分: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 optimiser能够缓存临时数据集(SELECT OrderId FROM Orders WHERE CustomerName,如'%peter%')

Ask Tom about temp tables and cursors

答案 1 :(得分:1)

您可以使用光标检索所有值并使用WHERE CURRENT OF sentence

您的光标将如下所示:

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. 在fect中,删除实际的行。
  5. 句子字词上的链接可以帮助您完成此操作。

    如果您在使用游标时遇到问题,这里有一个很好的introduction to Oracle 11g Cursors。另外,这个blog entry有一个很好的例子,使用带参数的游标。