首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更好的方法是在for循环中执行多个delete

更好的方法是在for循环中执行多个delete
EN

Stack Overflow用户
提问于 2020-10-07 18:24:34
回答 2查看 89关注 0票数 0

在批量收集之后,我希望从FOR循环中的多个表中删除记录。但是对于6-7个表,我在for循环中编写了6-7个delete语句。有没有更好的方法呢?

EN

回答 2

Stack Overflow用户

发布于 2020-10-07 19:17:48

为每个表编写一个delete,但不要使用FOR LOOP

对于一个人为设计的示例,如果您有以下表:

代码语言:javascript
运行
复制
CREATE TABLE table1 ( id NUMBER PRIMARY KEY );
CREATE TABLE table2 ( id NUMBER PRIMARY KEY, parent_id NUMBER );
CREATE TABLE table3 ( id NUMBER PRIMARY KEY, parent_id NUMBER );
CREATE TABLE table4 ( id NUMBER PRIMARY KEY, parent_id NUMBER );

和示例数据:

代码语言:javascript
运行
复制
INSERT INTO table1 ( id )
SELECT 1 FROM DUAL UNION ALL
SELECT 2 FROM DUAL UNION ALL
SELECT 3 FROM DUAL;

INSERT INTO table2 ( id, parent_id )
SELECT id + 0.1, id FROM table1 UNION ALL
SELECT id + 0.2, id FROM table1;

INSERT INTO table3 ( id, parent_id )
SELECT id + 0.01, id FROM table2 UNION ALL
SELECT id + 0.02, id FROM table2;

INSERT INTO table4 ( id, parent_id )
SELECT id + 0.001, id FROM table3 UNION ALL
SELECT id + 0.002, id FROM table3;

并且您希望从table4中删除3.1122.121,然后从其他表中删除所有父行。然后,您可以使用:

代码语言:javascript
运行
复制
CREATE TYPE number_list IS TABLE OF NUMBER;
代码语言:javascript
运行
复制
DECLARE
  p_to_delete  number_list;
  p_to_delete2 number_list;
BEGIN
  SELECT id
  BULK COLLECT INTO p_to_delete
  FROM   table4
  WHERE  id IN ( 3.112, 2.121 );
  
  DBMS_OUTPUT.PUT_LINE( 'Table 4: ' || p_to_delete.COUNT || ' rows to be deleted.' );

  DELETE FROM table4
  WHERE  id MEMBER OF p_to_delete
  RETURNING parent_id BULK COLLECT INTO p_to_delete2;
  
  DBMS_OUTPUT.PUT_LINE( 'Table 4: ' || SQL%ROWCOUNT || ' rows deleted.' );

  DBMS_OUTPUT.PUT_LINE( 'Table 3: ' || p_to_delete2.COUNT || ' rows to be deleted.' );

  DELETE FROM table3
  WHERE  id MEMBER OF p_to_delete2
  RETURNING parent_id BULK COLLECT INTO p_to_delete;
  
  DBMS_OUTPUT.PUT_LINE( 'Table 3: ' || SQL%ROWCOUNT || ' rows deleted.' );
  
  DBMS_OUTPUT.PUT_LINE( 'Table 2: ' || p_to_delete.COUNT || ' rows to be deleted.' );

  DELETE FROM table2
  WHERE  id MEMBER OF p_to_delete
  RETURNING parent_id BULK COLLECT INTO p_to_delete2;
  
  DBMS_OUTPUT.PUT_LINE( 'Table 2: ' || SQL%ROWCOUNT || ' rows deleted.' );

  DBMS_OUTPUT.PUT_LINE( 'Table 1: ' || p_to_delete2.COUNT || ' rows to be deleted.' );

  DELETE FROM table1
  WHERE  id MEMBER OF p_to_delete2;
  
  DBMS_OUTPUT.PUT_LINE( 'Table 1: ' || SQL%ROWCOUNT || ' rows deleted.' );
END;
/

输出:

表4:要删除的2行。表4:删除了2行。表3:要删除的2行。表3:删除了2行。表2:要删除的2行。表2:删除了2行。表1:要删除的2行。表1:删除了2行。

没有FOR ... LOOP,每一步都会删除多个行。

db<>fiddle

票数 2
EN

Stack Overflow用户

发布于 2020-10-07 18:42:03

PL/SQL读取"Oracle“。它不允许您在一条DELETE语句中删除多个表,我假设您当前拥有的是如何完成的:逐个表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64242091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档