【发布时间】:2020-01-25 19:19:32
【问题描述】:
我需要备份所有将被以下代码删除的记录。为此,我试图用select * 替换所有删除命令并使用jdbc ResultSet 将其保存到文件中,但我被困在下面的sn-p 中,其中记录被标记然后循环删除。我尝试使用 select..in and...exist 语句扩展此逻辑,但查询处理时间太长,并且可能在生产中失败。我也尝试过使用sys_refcursor,但问题是delete 在循环内,无法更新游标。因此,基本要求是如何将以下代码删除的所有记录存储在 out_parameter 中并返回。请帮忙!谢谢。
DECLARE
CURSOR purger(p_reference IN VARCHAR2) IS
SELECT DISTINCT id, reference, PARENT, LEVEL
FROM table ps1
START WITH ps1.reference = p_reference
CONNECT BY PRIOR ps1.reference = ps1.parent;
BEGIN
FOR i IN (SELECT DISTINCT reference
FROM table
WHERE PARENT IS NULL)
LOOP
l_level := 'N';
FOR j IN purger(i.reference)
LOOP
IF j.level > 1
THEN
l_level := 'Y';
END IF;
END LOOP;
IF l_level = 'N'
THEN
DELETE FROM tale WHERE reference = i.reference;
END IF;
IF l_level = 'Y'
THEN
DELETE FROM table
WHERE id IN (SELECT DISTINCT id
FROM table ps1
START WITH ps1.reference = i.reference
CONNECT BY PRIOR ps1.reference = ps1.parent);
END IF;
END LOOP;
END
【问题讨论】:
-
您是否考虑过为要删除记录的表创建触发器? ON DELETE 触发器可以先将即将删除的记录插入到单独的表中。
-
不幸的是,由于时间和流程限制,目前不可能进行任何数据库端更改。所以我试图将此删除查询转换为选择查询并在匿名块中运行。
-
我只是需要帮助来将此循环转换为选择查询。
标签: sql oracle plsql database-cursor