好的,基本上我需要从一列中选择多个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在早些时候宣布。
任何人都有关于如何做到这一点的一些建议?我不确定这种批量收集是否可行,或者是否有完全不同的方法,或者我是否只是错误。
谢谢!
答案 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%')
答案 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;
编辑:这个问题的逻辑可以是这样的:
句子字词上的链接可以帮助您完成此操作。
如果您在使用游标时遇到问题,这里有一个很好的introduction to Oracle 11g Cursors。另外,这个blog entry有一个很好的例子,使用带参数的游标。