oracle 大表删除数据,保留部分数据(一般以时间来限制,最好时间有索引这样更方便)
一:简单
begin /*开始*/
loop --循环执行
delete from USER_PAY_CASH_SUM where GET_DATE< to_date('2018-01-01','YYYY-MM-DD') and rownum<=5000;
--没有记录时退出
exit when sql%notfound;
commit; /*记住每次要提交*/
end loop;
end;
/ --反斜杠表示程序执行
**********************************************************
二:复杂
round_int设置循环的执行的次数,修改执行删除的语句。
返回:每次删除的行及删除的总行数
SET SERVEROUTPUT ON; --输出信息默认是关闭,要先打开在sqlplus中才看得到DBMS_OUTPUT.PUT_LINE的输出。
declare
round_int number:=5; --执行5次,设置执行的次数
v_num number:=0; --本次执行的行数
v_sum number:=0; --行数加总
i number:=1; --循环基数,从1开始
BEGIN
loop
--控制删除次数
IF not i<=round_int THEN
exit; --退出循环
END IF;
--删除语句
delete from USER_PAY_CASH_SUM where GET_DATE< to_date('2018-01-01','YYYY-MM-DD') and rownum<=5000;
v_num := sql%rowcount; --得到本次执行的记录数
v_sum :=v_sum +v_num; --合计
--输出本次记录
dbms_output.put_line('DELETE ROWS:' || v_num);
exit when sql%notfound; --无数据退出
commit; /*记住每次要提交*/
i:=i+1;
end loop;
--输出合计
DBMS_OUTPUT.PUT_LINE('DELETE ALL ROWS:' || v_sum);
END;
/
*****************************************************************************
三,用存储过程来删除
CREATE OR REPLACE
PROCEDURE "delete_rows" (round_int IN NUMERIC DEFAULT '0')
AS
v_num number:=0; --本次执行的行数
v_sum number:=0; --行数加总
i number:=1; --循环次数
BEGIN
loop
--控制删除次数
IF not i<=round_int THEN
exit; --退出循环
END IF;
delete from USER_PAY_CASH_SUM where GET_DATE< to_date('2018-01-01','YYYY-MM-DD') and rownum<100;
v_num := sql%rowcount; --得到本次执行的记录数
v_sum :=v_sum +v_num; --合计
--输出本次记录
dbms_output.put_line('DELETE ROWS:' || v_num);
exit when sql%notfound;
commit; /*记住每次要提交*/
i:=i+1;
end loop;
--输出合计
DBMS_OUTPUT.PUT_LINE('DELETE ALL ROWS:' || v_sum);
END;