我必须使用PL_SQL匿名块来删除许多表中的行。 每个表都与主表“ TABLE1”相关,并且我无法添加CASCADE DELETE。我必须做类似的事情
DELETE FROM table2 WHERE foreign_key in (SELECT ID FROM table1 WHERE ...).
DELETE FROM table3 WHERE foreign_key in (SELECT ID FROM table1 WHERE ...).
...
“ SELECT ID ..”查询可能要花费几分钟,将所有ID放在临时表中或类似的东西有意义吗?因此,我只能执行一次“选择”查询。 有其他选择吗?
答案 0 :(得分:0)
如果
1: -ap-
2: -br-
3: -au-
需要很多时间,然后这取决于。结果可能会被缓存,因此下一次执行(从select id from table1 where ....
中删除时)不会持续那么长时间。
测试不会花费很多。删除几个旧表,然后使用CTAS创建一个“临时”表
table3
并在create table ids as
select id from table1 where ...
语句中使用它。您甚至不需要索引,因为无论如何您都必须执行全表扫描。
然后选择一个更好的选项。
答案 1 :(得分:0)
另一种方法是使用PL/SQL-Collections
:
DECLARE
id_list SYS.ODCINUMBERLIST;
BEGIN
SELECT ID
BULK COLLECT INTO id_list
FROM table1
WHERE ...
FORALL i IN id_list.FIRST..id_list.LAST
DELETE FROM table2
WHERE foreign_key = id_list(i);
FORALL i IN id_list.FIRST..id_list.LAST
DELETE FROM table3
WHERE foreign_key = id_list(i);
...
END;