ORACLE 通过存储过程循环删除数据

时间是通过参数传进来,返回删除行数、执行状态和报错信息等,在存储过程里也增加了信息表。

可以根据实际需求更改传参、sql等。

create or replace procedure testuser.prc_del_balhist(
in_start_date in number,    ---开始时间
in_end_date in number,      ----结束时间
o_sum_count OUT number,   ---总删除行数
o_status_flag out varchar2,  ---状态标志
o_err_code out varchar2,    ----报错码
o_err_msg out varchar2    ----报错信息
)


as
v_date date;                 ---日期变量
v_start_tm varchar2(50);             ---任务开始时间
v_dule_tm number;              ---运行时间 秒
v_del_count number;           ---- 删除行数
str_del_sql varchar2(1000);  ---删除sql

BEGIN
   o_status_flag    := 'begin';    
   v_del_count := 0;
   o_sum_count := 0;
   o_err_code := null;
   o_err_msg := null;
   str_del_sql := '';
   v_date := to_date(in_start_date,'yyyymmdd');
   loop
      v_start_tm := to_char(sysdate,'yyyymmdd hh24:mi:ss');
      str_del_sql := 'delete from testuser.balhist_test hist where  hist.baldate='''||v_date|| ''' and hist.crbal= ''0'' ';
      

      execute immediate str_del_sql ;
      v_del_count := sql%rowcount;
      commit;
      
      o_status_flag    := 'succ';    
      
      --- log info
      v_dule_tm := (sysdate - to_date(v_start_tm,'yyyymmdd hh24:mi:ss')) * 24 * 60 * 60;
      insert into testuser.prc_log (RUN_TIME,del_date,sql_str,cost_time,del_count,status,err_code,err_msg) values (to_char(sysdate,'yyyymmdd hh24:mi:ss'),to_char(v_date,'yyyymmdd'),str_del_sql,v_dule_tm,v_del_count,o_status_flag,o_err_code,o_err_msg);
      commit;      
      
      --- next day
      v_date := v_date + 1;
      o_sum_count := o_sum_count + v_del_count;
         exit when v_date > to_date(in_end_date,'yyyymmdd');
      
   end loop;

exception
  when others then
    rollback;
    o_status_flag    := 'failed';
    o_err_code := sqlcode;
    o_err_msg := substr(sqlerrm, 1, 500);   
end;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Oracle可以通过存储过程循环删除数据存储过程是在数据库中存储的一段SQL代码,可以被重复调用。以下是一个示例的存储过程,用于循环删除数据。 首先,我们需要定义一个存储过程,接受参数来控制删除的行数和删除的条件: ``` CREATE OR REPLACE PROCEDURE delete_data(p_num_rows IN NUMBER, p_condition IN VARCHAR2) IS v_total_rows NUMBER; v_deleted_rows NUMBER := 0; BEGIN SELECT COUNT(*) INTO v_total_rows FROM your_table WHERE your_condition; WHILE v_deleted_rows < p_num_rows AND v_deleted_rows < v_total_rows LOOP DELETE FROM your_table WHERE your_condition AND ROWNUM = 1; v_deleted_rows := v_deleted_rows + 1; END LOOP; COMMIT; -- 提交删除操作,将更改持久化 END; / ``` 然后,我们可以调用该存储过程来执行删除操作: ``` BEGIN delete_data(100, 'your_condition'); -- 删除100行满足条件的记录 END; / ``` 在上述示例中,存储过程`delete_data`接受两个参数:`p_num_rows`指定要删除的行数,`p_condition`指定删除的条件。首先,我们通过`SELECT COUNT(*)`语句获取总行数。然后,在`WHILE`循环中不断删除满足条件的记录,直到删除的行数达到指定的行数或达到总行数为止。每次删除一行后,我们使用计数器`v_deleted_rows`记录已删除的行数,并使用`COMMIT`语句将删除操作持久化。 使用存储过程循环删除数据Oracle数据库管理中的常见操作。通过存储过程,我们可以灵活地控制删除的行数和删除的条件,提供了更好的可重复性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值