在批量收集之后,我希望从FOR循环中的多个表中删除记录。但是对于6-7个表,我在for循环中编写了6-7个delete语句。有没有更好的方法呢?
发布于 2020-10-07 19:17:48
为每个表编写一个delete,但不要使用FOR LOOP
。
对于一个人为设计的示例,如果您有以下表:
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 );
和示例数据:
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.112
和2.121
,然后从其他表中删除所有父行。然后,您可以使用:
CREATE TYPE number_list IS TABLE OF NUMBER;
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
发布于 2020-10-07 18:42:03
PL/SQL读取"Oracle“。它不允许您在一条DELETE
语句中删除多个表,我假设您当前拥有的是如何完成的:逐个表。
https://stackoverflow.com/questions/64242091
复制相似问题