oracle 大批量删除数据分批commit

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wrh_csdn/article/details/80681893

一切以代码说话,

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;

猜你喜欢

转载自blog.csdn.net/wrh_csdn/article/details/80681893