Sql 此删除过程中出现任何错误。我们可以这样写吗?还是有更好的方法来写同样的程序
这里我们只是从主表和子表中删除90天历史记录之前的记录。假设表中有超过20k条记录要删除。在这里,我为每个5k记录提交。如果我错了,请告诉我Sql 此删除过程中出现任何错误。我们可以这样写吗?还是有更好的方法来写同样的程序,sql,oracle,plsql,Sql,Oracle,Plsql,这里我们只是从主表和子表中删除90天历史记录之前的记录。假设表中有超过20k条记录要删除。在这里,我为每个5k记录提交。如果我错了,请告诉我 create or replace Procedure PURGE_CLE_ALL_STATUS ( days_in IN number ) IS reccount NUMBER := 0; CURSOR del_record_cur IS SELECT EXCEPTIONID FROM EXCE
create or replace Procedure PURGE_CLE_ALL_STATUS ( days_in IN number )
IS
reccount NUMBER := 0;
CURSOR del_record_cur IS
SELECT EXCEPTIONID FROM EXCEPTIONREC
WHERE trunc(TIME_STAMP) < trunc(sysdate - days_in );
BEGIN
FOR rec IN del_record_cur LOOP
delete from EXCEPTIONRECALTKEY -- child table
where EXCEPTIONID =rec.EXCEPTIONID ;
delete from EXCEPTIONREC -- master table
where EXCEPTIONID =rec.EXCEPTIONID;
reccount := reccount + 1;
IF (reccount >= 1000) THEN
COMMIT;
count := 0;
END IF;
commit;
END LOOP;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Deleted ' || total || ' records from <OWNER>.<TABLE_NAME>.');
END;
/
如果您询问是否可以提高代码的效率,那么最有效的方法总是使用SQL
BEGIN
DELETE FROM EXCEPTIONRECALTKEY child
WHERE EXISTS( SELECT 1
FROM EXCEPTIONREC parent
WHERE child.EXCEPTIONID = parent.EXCEPTIONID
AND parent.timestamp <= trunc(sysdate - days_in ) );
DELETE FROM EXCEPTIONREC
WHERE timestamp <= trunc(sysdate - days_in );
END;
如果有从EXCEPTIONRECALTKEY到EXCEPTIONREC定义的外键,则可以对连接两个表的内联视图发出delete,对父表指定WHERE子句,并导致从子表中删除记录 因此:
你有什么特别的问题吗?谢谢你的回答。但如何在每5公里记录后应用提交?@user1396473-为什么要每5000行提交一次?这只会降低您的进程速度,并导致它消耗更多的数据库资源。如果需要恢复,每提交5000条记录也会让它变得有点模糊。比如说,在Oracle 8中,这种增量DML是个好主意,但在10g中呢?11克?不,你只是让自己的生活变得艰难和缓慢。我需要在每5公里记录被删除后提交,你能告诉我怎么写这样的记录吗。谢谢你在这里的大力帮助。
BEGIN
delete from (
select
p.EXCEPTIONID p_EXCEPTIONID,
c.EXCEPTIONID c_EXCEPTIONID,
c.TIME_STAMP c_TIME_STAMP
from
EXCEPTIONREC p,
EXCEPTIONRECALTKEY c
where
p.EXCEPTIONID = c.EXCEPTIONID and
c.TIMESTMAP < trunc(sysdate - days_in ));
delete from
EXCEPTIONREC
where
TIMESTMAP < trunc(sysdate - days_in );
end;
/