临时表删除

时间:2019-06-03 09:29:00

标签: oracle

我必须使用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放在临时表中或类似的东西有意义吗?因此,我只能执行一次“选择”查询。 有其他选择吗?

2 个答案:

答案 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;