巧用oracle中的job来运行程序

我之前在博客中总结过《oracle定时器job用法小结》这篇文章,那个时候才开始接触oracle,更是第一次接触oracle中的job,一直我都以为job主要是为了实现定时、反复执行某个程序,然而这几天在项目上我才发现,原来job的用处不仅于此。试想,你正在执行一段大概要几个小时才能跑完的程序,用以实现更新一个表中的数据,可是运行了一半,突然电脑蓝屏了,你想想这是多么可怕的事情,你再次打开的时候,你已经不知道哪些数据更新好了哪些没有更新,很显然直接重跑一遍程序是很明显不对的。当然,oracle有很完善的机制,其实就算上面这种情况电脑突然断了,只要程序没有commit也就不会更改数据,所以其实也是可以直接重新跑程序的,但是这里我不考虑这种情况,现假设程序中就有写commit。

遇到上面的这种情况,假如我们按照下面的这种方法去做,那又会怎么样?

(1)假设我的程序都写在了一个名为cmx_update_data_pkg包中,其中有很多function和procedure,而其中的一个叫做main的procedure就是该程序的执行入口,即直接运行cmx_update_data_pkg.main即可跑完整个程序,假设我们的数据量很大,main跑完要好几个小时。

(2)现在为了避免上面提到的那个问题,我在cmx_update_data_pkg包中再添加一个叫做job的function,在cmx_update_data_pkg中添加如下代码:

在cmx_update_data_pkg的包头中添加:

FUNCTION job RETURN BOOLEAN;

在cmx_update_data_pkg的包体中添加:

FUNCTION job RETURN BOOLEAN IS
  v_job NUMBER;
  v_sql VARCHAR2(2000);
BEGIN
  v_sql := 'BEGIN cmx_update_data_pkg.main; END;';
  dbms_job.submit(job       => v_job,
                  what      => v_sql,
                  next_date => SYSDATE,
                  INTERVAL  => NULL);
  dbms_output.put_line(v_job);
  COMMIT;
  RETURN TRUE;
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
END;

在添加完了上面的代码以后,编译一下包,然后直接运行cmx_update_data_pkg.job即可,这样就成功的在oracle中提交了一个job,可以通过dba_jobs数据字典来查找出这个job的执行情况,job提交成功后,程序会自动运行,就算电脑出故障了,oracle也会自动运行job中的程序。这个方法非常好用,昨天我就跑了一个程序,跑了十几个小时,如果不是用job,我可能就得一直开着电脑,并且电脑丝毫故障也不能发生,比如要保证网络不能断,所以,使用job可以提供很多便利。

本文标题:巧用oracle中的job来运行程序

本文链接:http://yedward.net/?id=173

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章