使用job模拟定时从元数据表中抽取指定数据进入目标表的过程。

一、创建元数据表

  --create table test_origianl

  

  create table test_original_data(
    id number(10,2) primary key,
    name varchar2(200),
    descCont varchar2(100),
    dateType char(5)

  );

二、元数据表中插入数据

  

  insert into test_original_data values(2.9,'name1','desc1','int');
  insert into test_original_data values(3.0,'name2','desc2','long');
  insert into test_original_data values(2.8,'name3','desc3','float');
  insert into test_original_data values(2.6,'name4','desc4','do');
  insert into test_original_data values(2.1,'name223','desc33','float');
  insert into test_original_data values(5.12,'name22r34','desc3r34','float');

三、提交事务

  commit;

四、创建目标表

  ---create table

  为保持与元数据表相同的表结构,使得元数据表中的记录可以不做任何修改直接插入目标表中,采用CTAS的方式创建目标表。

  

  create table test_destination_dat
  as
    select * from test_original_data where 1!=1;

  只创建相同的表结构,不导入元数据表中的记录。

五、提交事务

  commit;

六、创建定时被调用的存储过程

  ---- create procedure

  

  create or replace procedure job_test_pro
    authid current_user
  as
  begin

    --先truncate table清空原来的数据,重新把符号条件的数据导入(此处使用truncate在大数据量的情况下戏剧化的提高效率)
    execute immediate 'truncate table test_destination_dat';
    insert into test_destination_dat (select * from test_original_data where dateType='float' );
  exception
    when others then
    dbms_output.put_line('errorMsg'||SQLERRM||'errorCode'||SQLCODE);
  end job_test_pro;

  注:1、在存储过程中一般是没有create table 、truncate table的权限的。如果在存储过程中直接使用语句truncate table test_destination_dat会报错,不能执行该语      句。 在存储过程一般是不能直接使用create table,truncate table这类似的语句的,如果要使用这些语句必须使用excute immediate + 所要执行的sql语句来实现。

    2、Authid Current_User:

      这个语句比较重要,如果我们在创建存储过程的时候不添加这条语句执行该存储过程将不会成功,原因是默认情况存储过程是没有Create table,truncate table等       权限的,即使当前用户有DBA的权限也不行,如果存储过程中存在创建表、截断表的操作,可以有以下两种方式来解决该问题。

      (1) 显示的赋予该用户Create table的权限,grant create table to user.
      (2) 在存储过程中使用Authid Current_User 标识使用当前用户的权限。

七、创建job

  1、定义job名称

    variable job2014 number   ---定义在oracle中自动生成job的序号的数据类型对应到dba_jobs的数据字典中的字段job的值。现在job值为41对应名称为job2014数     据类型为number

  2、将job注册到dba_jobs表中定时启动job调用存储过程

    begin

      dbms_job.submit(:job2014,'JOB_TEST_PRO;',sysdate,'sysdate+1/1440');

    end;

    /

    commit;

    注意:dbms_job.submit()方法的定义如下

             sys.dbms_job.submit(job => :jobno,
what => 'myProc;myProcs;myProcss(''测试'');',//用分号将多个存储过程分开,有参数的话直接写就可以了
next_date => to_date('07-04-2011 22:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'sysdate+1');
        1、这里需要注意的是,在submit方法的前面一定要先定义job这个变量
       2、submit方法的第二个参数是一个存储过程的名,记得在后面添加“;”号
       3、在next_date是一个时间类型变量而不是一个字符串,所以需要注意不要把它当成字符串,不需要对该参数加引号
       4、最后一个参数interval是一个字符串类型,记得添加引号
       5、第一个参数格式为:jobno,目的是绑定job和存储过程。
       6、最常见的错误如下所示:ORA-01008: not all variables bound就是没有定义变量的意思。一定记的在使用submit方法时定义jobno变量。
       7、下面是常有的设置Interval的方法:
            每天固定时间运行,比如早上8点:Trunc(Sysdate+1) + 8/24
            每天:trunc(sysdate+1)
            每周:trunc(sysdate+7)
            每月:trunc(sysdate+30)
            每个星期日:next_day(trunc(sysdate),’SUNDAY’)
            每天6点:trunc(sysdate+1)+6/24
            半个小时:sysdate+30/1440
        8、声明变量和绑定job变量到存储过程并注册到dba_jobs表中必须在sqlplus下执行,在plsqldevloper中不能成功运行。
八、job异常情况处理
   JOB不能运行情况处理
    1.先来了解一下JOB的参数说明:与job相关的参数一个是job_queue_processes,这个是运行JOB时候所起的进程数,当然系统里面JOB大于这个数值后,就会有排     队等候的,最小值是0,表示不运行JOB,最大值是36,在OS上对应的进程时SNPn,9i以后OS上管理JOB的进程叫CJQn.可以使用下面这个SQL确定目前有几个SNP/C     JQ在运行。
     select * from v$bgprocess,这个paddr不为空的snp/cjq进程就是目前空闲的进程,有的表示正在工作的进程。
     另外一个是job_queue_interval,范围在1——3600之间,单位是秒,这个是唤醒JOB的process,因为每次snp运行完他就休息了,需要定期唤醒他,这个值不能     太小,太小会影响数据库的性能。
    2.诊断:先确定上面这两个参数设置是否正确,特别是第一个参数,设置为0了,所有JOB就不会跑,确认无误后,我们继续向下。
    3.使用下面的SQL察看JOB的的broken,last_date和next_date,last_date是指最近一次job运行成功的结束时间,next_date是根据设置的频率计算的下次执行     时间,根据这个信息就可以判断JOB上次是否正常,还可以判断下次的时间对不对,SQL如下:
     select * from dba_jobs
     有时候我们发现他的next_date是4000年1月1日,说明job要不就是在running,要不就是状态是break(broken=Y),如果发现JOB的broken值为Y,找用户了解     一下,确定该JOB是否可以broken,如果不能broken,那就把broken值修改成N,修改再使用上面的SQL察看就发现他的last_date已经变了,JOB即可正常运行,     修改broken状态的SQL如下:
      declare
      BEGIN
        DBMS_JOB.BROKEN(<JOB_ID>,FALSE);
      END;
    4.使用下面的SQL查询是否JOB还在Running
      select * from dba_jobs_running
     如果发现JOB已经Run了很久了还没有结束,就要查原因了。一般的JOB running时会锁定相关的相关的资源,可以查看一下v$access和v$locked_object这两个v     iew,如果发现其他进程锁定了与JOB相关的Object,包括PKG/Function/Procedure/Table等资源,那么就要把其他进程删除,有必要的话,把JOB的进程也删除     ,再重新跑看看结果。
    5.如果上面都正常,但是JOB还不run,怎么办?那我们要考虑把JOB进程重启一次,防止是SNP进程死了造成JOB不跑,指令如下:
      alter system set job_queue_processes=0 ——关闭job进程,等待5——10秒钟
      alter system set job_quene_processes=5 ——恢复原来的值
九、手动运行job的指令
  begin
    dbms_job.run(:job2014);
  end;
  /
十、删除job
  begin
    dbms_job.remove(:job2014);
  end;
  /
十一、查看job相关视图及各字段的注解
  

  select job,last_date,last_sec,broken,failures,interval, what from dba_jobs


  详解 dba_jobs中几个比较重要的字段


  job: 指的是job的id号。比如上面的 41


  failures:job执行的时候失败次数,如果超过了15次,那么broken列将被标为Y,以后就不会运行该job了


  broken:默认为N,如果为Y,意味着不再执行该job!


  interval:执行job的间隔时间。


  what:该job的实际工作。

  总结:模拟定时从元数据表中抽取指定类型的数据添加到目标表中,用定时job调用存储过程。


  

oracle中job定时调用存储过程的实例的更多相关文章

  1. Oracle之带参存储过程(存储过程中for循环调用存储过程)

    --带参存储过程create or replace procedure testdate(v in number) is i number; begin i:=v; insert into test_ ...

  2. Oracle通过JOB定时执行存储过程实现两表数据比对

    需求: 第三方云平台管理的虚拟机会进行关机.资源扩展等操作,因此开关机状态.CPU.内存.磁盘大小等数据需要进行同步.这里第三方云平台是BMC CLM云平台,底层虚拟化平台是Vcenter.进行同步的 ...

  3. PHP中通过sqlsrv调用存储过程——成绩排名去除重复字段的数据行

    培训考试项目中,需要实现考试成绩排名:排名参考项为分数(score降序).参加日期(attendtime升序).第几次参加考试(frequency升序):并且,每个用户只保留一条数据(pid). 考试 ...

  4. Web Services调用存储过程简单实例

    转:http://www.cnblogs.com/jasenkin/archive/2010/03/02/1676634.html Web Services 主要利用 HTTP 和 SOAP 协议使商 ...

  5. 【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】

    疑问:怎样判断存储过程执行之后返回值是否为空. 一.连接oracle数据库 1.需要的jar包:在安装的oracle中就有,所以不需要到官网下载,我的oracle11g下:D:\app\kdyzm\p ...

  6. 使用CompletionService结合ExecutorService批处理调用存储过程任务实例

    此实例为java多线程并发调用存储过程实例,只做代码记载,不做详细描述 1.线程池构造初始化类CommonExecutorService.java package com.pupeiyuan.go; ...

  7. oracle创建函数和调用存储过程和调用函数的例子(区别)

    创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...

  8. Oracle定时调用存储过程

    #1Demo: 1.创建表 create table job_table(run_time date); 2.创建存储过程 create or replace procedure job_proc i ...

  9. oracle利用job创建一个定时任务,定时调用存储过程

    --创建表 create table TESTWP ( ID ), C_DATE DATE ); select * from TESTWP; --2.创建一个sequence create seque ...

随机推荐

  1. uva 1594 Ducci Sequence <queue,map>

    Ducci Sequence Description   A Ducci sequence is a sequence of n-tuples of integers. Given an n-tupl ...

  2. Java实现的 线程池

    由于最近开始学习java,用到了线程池,按照之前c++的写法写出此java版的线程池 TaskRunnale实现相关任务的接口,具体要实现什么任务在相应的run函数中实现. package threa ...

  3. 13年山东省赛 The number of steps(概率dp水题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud The number of steps Time Limit: 1 Sec  Me ...

  4. (原)ubuntu16中简单的使用google的protobuf

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5804395.html 参考网址: http://www.cnblogs.com/luosongchao ...

  5. mysql中函数DISTINCT,group by,CONCAT及GROUP_CONCAT的使用

    一:DISTINCT 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是 ...

  6. Android SDK 更新时修改hosts文件仍然无法更新,可试试这个方法……

    Android SDK 更新时修改hosts文件仍然无法更新,此时必定万分蛋疼.在hosts文件中更换了各种ip,仍然解决不了!!!!!!!!!!!!!!? 第一步: 打开此软件,等待服务器连接 第二 ...

  7. python运维开发(十七)----jQuery续(示例)web框架django

    内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...

  8. 小插曲之变量和字符串 - 零基础入门学习Python003

    小插曲之变量和字符串 让编程改变世界 Change the world by program 变量 (此处只是省略N多细节,详细通过视频学习) 变量名就像我们现实社会的名字,把一个值赋值给一个名字时, ...

  9. 异常处理与调试3 - 零基础入门学习Delphi52

    异常处理与调试3 让编程改变世界 Change the world by program 两种结构的嵌套 要在一个过程里同时实现处理异常和保护资源分配,关键要保证"try-except&qu ...

  10. X-factor Chains(POJ3421 素数)

    X-factor Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6212   Accepted: 1928 D ...