清理过期数据的存储过程

create or replace procedure p_clear_expired_data
-- 根据指定的表名和字段名清理过期数据, 可配置为job运行
-- author: zhaohuihua
(
    i_tablename        in  varchar2,  -- 表名
    i_timefield        in  varchar2,  -- 时间字段名
    i_howlong          in  integer    -- 清理多久以前的数据(单位:天)
)
as
    fmt constant varchar2(100) := 'yyyy-mm-dd'; -- 日期格式常量
    max_loop constant integer  := 20; -- 每次最大循环次数
    max_count constant integer := 5000; -- 每次最大删除行数
    v_sql        varchar2(1000);
    v_time        varchar2(100);
    v_loop        integer;
    v_count      integer;
begin
    if i_timefield is null or i_tablename is null
    or i_howlong is null or i_howlong < 0 then
        return;
    end if;

    -- 计算时间
    v_time := to_char(sysdate - i_howlong, fmt);
    -- 构造删除数据的sql语句
    v_sql := 'delete ' || i_tablename
        || ' where ' || i_timefield
        || ' < to_date(''' || v_time || ''', ''' || fmt || ''')'
        || ' and rownum <= ' || max_count;

    for v_loop in 1 .. max_loop loop
        execute immediate v_sql; -- 删除数据
        v_count := sql%rowcount; -- 影响行数
        commit;
        if v_count < max_count then
            exit; -- 没有数据可删除则退出
        end if;
    end loop;

exception
    when others then
        rollback;
end p_clear_expired_data;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值