--比如A表记录rowid,列为col_rowid,B表为业务表数据,也存在rowid列,可以下面方式删除,主要使用FORALL,可以高效执行批量删除
CREATE OR REPLACE PROCEDURE SYSDBA.DELETE_ROWID AS
DECLARE
-- 定义每次删除的行数
BATCH_SIZE CONSTANT NUMBER := 1000;
-- 定义游标,获取A表中的col_rowid
CURSOR cur_a IS
SELECT col_rowid FROM A;
-- 定义变量存储col_rowid
TYPE rowid_table IS TABLE OF ROWID INDEX BY PLS_INTEGER;
v_rowids rowid_table;
BEGIN
-- 打开游标
OPEN cur_a;
--比如A表记录rowid,列为col_rowid,B表为业务表数据,也存在rowid列,可以下面方式删除,主要使用FORALL,可以高效执行批量删除
CREATE OR REPLACE PROCEDURE SYSDBA.DELETE_ROWID AS
DECLARE
-- 定义每次删除的行数
BATCH_SIZE CONSTANT NUMBER := 1000;
-- 定义游标,获取A表中的col_rowid
CURSOR cur_a IS
SELECT col_rowid FROM A;
-- 定义变量存储col_rowid
TYPE rowid_table IS TABLE OF ROWID INDEX BY PLS_INTEGER;
v_rowids rowid_table;
BEGIN
-- 打开游标
OPEN cur_a;
LOOP
-- 每次从游标中获取BATCH_SIZE条col_rowid
FETCH cur_a BULK COLLECT INTO v_rowids LIMIT BATCH_SIZE;
-- 如果没有数据则退出循环
EXIT WHEN v_rowids.COUNT = 0;
-- 批量删除B表中与A表col_rowid匹配的数据
FORALL i IN 1..v_rowids.COUNT
DELETE FROM B WHERE rowid = v_rowids(i);
-- 提交事务
COMMIT;
END LOOP;
-- 关闭游标
CLOSE cur_a;
END;
/