• 踩坑の oracle dbms_job简单使用


    二话不说先上代码

    --创建存储过程
    create or replace procedure job_truncateState is  
    begin    
      --此处就是要定时执行的sql
    execute immediate 'TRUNCATE TABLE T_TOKEN';
    end;
    /
    declare job number; 
    begin   
    sys.dbms_job.submit(job, 'job_truncateState;', sysdate, 'TRUNC(sysdate)+1+12/(24)'); 
    end
    commit; 
    /
    commit;
    

    细节说明

    1. 这段代码可用plsql工具new菜单栏下的sql window执行,如果不想创建存储过程procedure,可以直接用job window创建,只是此时生成的脚本无法使用sql window执行。该方法用工具操作很简单,此处就不举例啦(啊喂,要学会举一反三好不,。。。别揭我短毕竟懒啊哈哈哈)

    2. 加上这个“execute immediate”,不为装13,起初还以为是我哪里符号出了问题,还是博客大法好,这不,前人留下经验之谈,如果不加的话就会编译异常而导致创建失败,具体原因还未去了解。有兴趣的完全可以抛弃此文扬长而去观摩其他大佬的文章~

    3. 要执行的sql还有job.submit里边job名字后面,都要记得加分号,不然可能同样会引起编译异常,养成好习惯记得加上最好啦哈哈哈。

    4. job number在声明declare后系统会给你分配一个,同样用job window创建时,无需画蛇添足手动添加作业务号,我还没试过,有兴趣的可以踩踩更大的坑哈哈哈。

    5. sysdate是下一次执行时间next_date。用sql创建时必须显示指定,系统会自己算(Pass:此处指oracle数据库的系统时间,暗中观察比实际时间要稍慢,引起原因多种多样,一时说不清,所以不要大惊小怪即可= =)也就是sysdate,用job window创建时可以不指定,同样都是默认用创建job的时间。

    6. 重头戏之时间设置。代码中TRUNC(sysdate)+1+12/(24)意思 是每天十二点执行一次,具体语法此处不多敖述,下方贴上多个实例,大家多看几眼对比一下就懂了哎我说真的。

    每分钟执行 Interval => TRUNC(sysdate,'mi') + 1/(24*60) 每天的凌晨1点执行 Interval => TRUNC(sysdate) + 1 +1/(24) 每周一凌晨1点执行 Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 每月1日凌晨1点执行 Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 每季度的第一天凌晨1点执行 Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24 每年1月1日凌晨1点执行 Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'), 12)+1/24
    1. 创建完毕可在procedures文件夹查看存储过程,在DBMS_Jobs查看作业。一般创建后系统就会自动运行。

    查看运行效果

    select job,last_date,next_date,broken,failures from user_jobs
    

      一般看这几个足够了,愿意的话直接查看所有也行,其他字段没啥好看的。都是字面意思,需要说明的就只有两个。broken指是否正在运行,N表示正在运行,Y表示已停止;failures指失败次数,不论是右键手动run还是用sql跑,失败次数都会记录。user_jobs指当前用户拥有的所有job。

    那么问题来了

      做完以上动作我竟然只运行了一次!也就是刚手动run的时候执行了一次就不再执行了,当然我也不是说第二天才知道结果,毕竟第一次搞这个,我会先用30秒执行一次来确保能够执行,然后再把时间换做每天十二点即可。庆幸的是我有这个习惯,不幸的是果不其然不是我的错,我和我的编译器都惊呆了!不耻下问的吱了领导一声,说是数据库配置的问题——job_queue_processes。这不,几分钟的事搞了我几个小时,姜还是老的辣啊实在可怕...由于不是我自己解决的,虽然有查到问题所在,但是没有权限去尝试,这里就不误导大家啦,随便一搜“dbms_job 只执行一次”等关键字就有许多大佬篇章,有兴趣有条件的自己去尝试啦~

    那又如何停止

    1. 查看作业号

     就是上面查看运行效果的sql

    2. 停止作业

    begin
     dbms_job.broken(这里是你的job号, true, sysdate);
     commit;
    end;
    /
    

    3. 查看是否停止成功

      还是上面查看运行效果的sql,如果broken字段值为Y就说明停止成功。

    总结

      其实并没有抱怨说浪费多少时间,只是小白就应该如此去多踩坑,然后自学,查资料,一步一步,印象才会深刻。当然啦也要讲方法,还有就是遇到问题后要懂得如何根据关键字搜索,脑筋稍微转转弯还是必要的,总不能说,搞了一整天连相关的关键字都说不出来,那就说不过去了吧。呵呵,作为码畜的我居然说起大道理来,实在是打脸,惭愧。虽有食言毕业前不花时间作技术文,可怎么想都应该做个笔记,又不想花时间以后还要再搬一次,干脆一次性弄完算了呼~

  • 相关阅读:
    10天学安卓-第八天
    10天学安卓-第七天
    10天学安卓-第六天
    10天学安卓-第五天
    10天学安卓-第四天
    10天学安卓-第三天
    透过 Cucumber 学习 BDD
    应对复杂软件的思考
    管理任务就是管理时间
    Running Dubbo On Spring Boot
  • 原文地址:https://www.cnblogs.com/call-me-devil/p/8566359.html
Copyright © 2020-2023  润新知