zoukankan      html  css  js  c++  java
  • Oracle定时任务Job笔记

    定时任务应用场景:

      某一个生产系统上面,临时表不断变多,占了不少磁盘空间。由于这套软件是直接买的,不方便修改源代码。所以考虑使用Oracle定时任务直接从数据库层删除临时表。

    定时任务业务:

      首先写好一个存储过程。读当前用户所有以tempXXXXX开头的临时表,然后依次删除所有的临时表。然后在建立Oracle Job每天晚上定时调用这个存储过程。

    存储过程代码:

    create or replace PROCEDURE KDDROPTEMPTABLE AS
    BEGIN
      declare
      cursor c_usertable is
      select table_name from user_tables t where t.TABLE_NAME like 'TEMPTABLE0000%' and status = 'VALID';
      my_tablename user_tables.table_name%TYPE;
      v_sql varchar2(200);
      v_count integer := 0;
      begin
        --DBMS_OUTPUT.ENABLE(buffer_size => null);
           open c_usertable;
             loop
               --提取一行数据到c_usertable
               fetch c_usertable into my_tablename;
               exit when c_usertable%notfound;
               v_sql := 'drop table '||my_tablename;
               execute immediate v_sql;
               v_count := v_count+1;
               -- dbms_output.put_line(v_sql);
             end loop;
           --关闭游标
          close c_usertable;
          dbms_output.put_line('总工删除的临时表数量:'||v_count);
      end;
    END KDDROPTEMPTABLE;

    Oracle定时任务建立步骤

    Oracle有两种语法可以建定时任务,Oracle10g以后就开始推荐使用下面这种。老的方式本文不涉及。

    如果你有Oracle SQL developer可以用界面新建

    以下是通过SQL直接建Job:

    BEGIN
        DBMS_SCHEDULER.CREATE_JOB (
                job_name => '"ZSNC57"."autoDeleteTemp"',
                job_type => 'STORED_PROCEDURE',
                job_action => 'ZSNC57.KDDROPTEMPTABLE',
                number_of_arguments => 0,
                start_date => TO_TIMESTAMP_TZ('2018-09-12 14:41:09.000000000 ASIA/SHANGHAI','YYYY-MM-DD HH24:MI:SS.FF TZR'),
                repeat_interval => 'FREQ=DAILY;BYHOUR=14;BYMINUTE=45;BYSECOND=0',
                end_date => NULL,
                enabled => FALSE,
                auto_drop => TRUE,
                comments => '自动删除临时表');

             
        DBMS_SCHEDULER.SET_ATTRIBUTE(
                 name => '"ZSNC57"."autoDeleteTemp"',
                 attribute => 'restartable', value => TRUE);
         
     
        DBMS_SCHEDULER.SET_ATTRIBUTE(
                 name => '"ZSNC57"."autoDeleteTemp"',
                 attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_FULL);
          
     
        
        DBMS_SCHEDULER.enable(
                 name => '"ZSNC57"."autoDeleteTemp"');
    END;


    直接手动运行定时任务的方式(目前还没研究出来为啥一直报错):
    begin
        dbms_scheduler.run_job('autoDeleteTemp',TRUE); -- true代表同步执行
    end;

    注:如果直接执行存储过程可以执行,但定时任务却始终执行不了,执行以下步骤:

       select * from dba_sys_privs where grantee='oracle_user_name';
     查询一下当前用户被直接赋予的权限有哪些.如果没有的话执行下列赋权语句.
     grant create job to oracle_user_name;
     grant MANAGE SCHEDULER  to oracle_user_name;
     show parameter job;  --显示当前job参数,如果job_queue_processes = 0则执行下面语句修改.
     alter system set job_queue_processes = 1;

    如果你的Job正常运行了,通过如下几张表可以查询到运行记录:

    --Oracle定时任务
    -- job信息
    select * from user_scheduler_jobs;
    --  job日志
    select * from User_Scheduler_Job_Log;
    -- job运行日志
    select * from user_scheduler_job_run_details;
    --正在运行的job
    select * from user_scheduler_running_jobs;

    在Oracle SQL developer中也有集成界面

  • 相关阅读:
    MySQL令人咋舌的隐式转换
    阿里规范中为什么要求表必须有主键id
    理解Python闭包,这应该是最好的例子
    MySQL 高级(进阶) SQL 语句精讲(二)
    什么是可串行化MVCC
    Oracle11g:数据库恢复总结
    以友盟+U-Push为例,深度解读消息推送的筛选架构解决方案应用与实践
    一万字详解 Redis Cluster Gossip 协议
    [JS]给String对象添加方法,使传入的字符串字符之间以空格分开输出
    [JS]计算字符串中出现最多的字符和其出现次数
  • 原文地址:https://www.cnblogs.com/namelessmyth/p/9634883.html
Copyright © 2011-2022 走看看