一切以代码说话,
CREATE OR REPLACE PROCEDURE prc_del_big_rec(i_tablename IN VARCHAR2,
i_condition IN VARCHAR2,
i_count IN VARCHAR2) AS
PRAGMA AUTONOMOUS_TRANSACTION;
v_delete_rows NUMBER := 0;
BEGIN
WHILE 1 = 1 LOOP
EXECUTE IMMEDIATE 'delete from ' || i_tablename || ' where ' ||
i_condition || ' and rownum <= :rn'
USING i_count;
IF SQL%NOTFOUND THEN
EXIT;
ELSE
v_delete_rows := v_delete_rows + SQL%ROWCOUNT;
END IF;
COMMIT;
END LOOP;
COMMIT;
prc_running_log('prc_del_big_rec',
SYSDATE,
'Finished, Totally ' || to_char(v_delete_rows) ||
' records deleted',
NULL);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
prc_running_log('prc_del_big_rec',
SYSDATE,
'异常回滚',
substr(SQLERRM, 1, 255));
RAISE;
END;
--相关联存储过程
CREATE OR REPLACE PROCEDURE prc_running_log(i_prc_name VARCHAR2, --程序名称
i_date DATE, --记录运行时间,一般为当前系统时间
i_running_info VARCHAR2, --运行日志
i_errm_remark VARCHAR2 --运行错误信息或其他备注
) IS
--记录运行日志及错误信息
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
--赋值运行的程序名称
INSERT INTO tbl_running_log_info
VALUES
(tbl_running_log_info_seq.nextval,
i_prc_name,
i_date,
i_running_info,
i_errm_remark);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END prc_running_log;
--执行删除存储过程
declare
v_last_month varchar2(8);
begin
v_last_month :='201805';
prc_del_big_tbl(i_tablename => 'tmp_wrh_test',
i_condition => 'substr(sum_date,1,6) =' ||
v_last_month,
i_count => 1000);
end;