oracle 动态存储过程

2 篇文章 0 订阅
2 篇文章 0 订阅

1. 定时 

begin

sys.dbms_scheduler.create_job(job_name => 'job_pro_his_delete_cp',

job_type => 'STORED_PROCEDURE',

job_action => 'pro_his_delete_cp',

start_date => sysdate,

repeat_interval => 'FREQ=DAILY;BYHOUR=1;BYMINUTE=0;BYSECOND=0',

end_date => to_date(null),

enabled => true,

auto_drop => false,

comments => '历史经验删除by stationCode,每天1点');

end;

 

2. -----存储过程

-- DROP PROCEDURE if EXISTS pro_his_delete;/

CREATE OR REPLACE PROCEDURE pro_his_delete_cp AS

V_DELETE_HIS_COUNT VARCHAR2(10); --删除历史经验条数

V_DELETE_SEG_COUNT VARCHAR2(10); --删除分词历史经验条数

   V_STATIONCODE varchar2(10);

V_HISTABLENAME varchar2(50); --表名

V_SEGTABLENAME varchar2(50); --表名

    v_his_cnt_sql varchar2(500);

    v_his_del_sql varchar2(500);

    v_seg_cnt_sql varchar2(500);

    v_seg_del_sql varchar2(500);

    v_pro_udt_sql varchar2(500);

    

BEGIN

---循环

FOR HIS_DELETE IN (SELECT t.STATIONCODE,t.HISTABLENAME,t.SEGTABLENAME

FROM gisdata.T_PRO_HIS_DELETE t

WHERE t.ISDELETE = 'N'

                      )

LOOP

V_STATIONCODE := HIS_DELETE.STATIONCODE;

     V_HISTABLENAME := HIS_DELETE.HISTABLENAME;

     V_SEGTABLENAME := HIS_DELETE.SEGTABLENAME;

    

     v_his_cnt_sql :=' SELECT COUNT(*) FROM ' || V_HISTABLENAME|| ' WHERE STATIONCODE = ''' || V_STATIONCODE || '''';

execute immediate v_his_cnt_sql into V_DELETE_HIS_COUNT;

dbms_output.put_line(V_DELETE_HIS_COUNT);

 

     v_his_del_sql := 'DELETE FROM ' || V_HISTABLENAME || ' WHERE STATIONCODE = ''' || V_STATIONCODE ||'''';

     dbms_output.put_line(v_his_del_sql);

     execute immediate v_his_del_sql;

    

     v_seg_cnt_sql :=' SELECT COUNT(*) FROM ' || V_SEGTABLENAME|| ' WHERE BIZCODE = ''' || V_STATIONCODE || '''';

execute immediate v_seg_cnt_sql into V_DELETE_SEG_COUNT;

dbms_output.put_line(V_DELETE_SEG_COUNT);

    

v_seg_del_sql := 'DELETE FROM ' || V_SEGTABLENAME || ' WHERE BIZCODE = ''' || V_STATIONCODE ||'''';

     dbms_output.put_line(v_seg_del_sql);

     execute immediate v_seg_del_sql;

 

--   v_pro_udt_sql := 'UPDATE T_PRO_HIS_DELETE t SET t.MODIFYTIME = SYSDATE, t.ISDELETE = ''Y'', t.DELETEHISCOUNT = '''

--                      || V_DELETE_HIS_COUNT || ''', t.DELETESEGCOUNT = ''' || V_DELETE_SEG_COUNT ||''' WHERE t.STATIONCODE = '''

--                      || V_STATIONCODE ''' AND t.ISDELETE = ''N''';

v_pro_udt_sql := 'UPDATE T_PRO_HIS_DELETE t SET t.MODIFYTIME = SYSDATE, t.ISDELETE = ''Y'', t.DELETEHISCOUNT = '''

                      || V_DELETE_HIS_COUNT || ''', t.DELETESEGCOUNT = ''' || V_DELETE_SEG_COUNT ||''' WHERE t.ISDELETE = ''N'' and t.STATIONCODE = '''

                      || V_STATIONCODE || '''';

    dbms_output.put_line(v_pro_udt_sql);

    execute immediate v_pro_udt_sql;

COMMIT;

END LOOP;

 

--异常处理

EXCEPTION

WHEN others THEN

dbms_output.put_line(SQLCODE || '::'||SUBSTR(SQLERRM, 1, 200));

rollback;

END;

/

3.调用存储过程

-- 执行

begin

pro_his_delete_cp();

end;

-- 或 

call pro_his_delete_cp();

4.手动 调用job,不需等定时


 begin 
-- Call the procedure 
sys.dbms_scheduler.run_job(job_name => 'job_pro_his_delete_cp', 
            use_current_session => 'false'); 
end; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值