使用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. (转)Source vs Binary Disadvantages & Advantages of each!

    原链接:http://www.linuxforums.org/forum/newbie/26472-source-vs-binary-disadvantages-advantages-each.htm ...

  2. YUI Array 之hash

    hash就是把两个参数合并成一个类似hashMap结构的对象,用第一个数组的元素为key,第二个的为value,如果第二个参数未指定,则把对象的对应的值置为true YUI原码 YUI hashYAr ...

  3. 使用jekyll主题

    github上面有很多基于jekyll的主题 https://github.com/theme4jekyll 使用起来也非常方便.直接clone到本地 这些主题,包括了很多模板,在新建博客的时候可以在 ...

  4. NAS4Free 配置BT下载

    NAS4Free 9.3.0.2 开启BT下载功能 Services|BitTorrent 选中右上角的复选框 Peer port 是监听端口,用于接受外部连接,需要在路由器配置该端口到服务器,才能提 ...

  5. 玩转Firefox侧栏

    偶然看到煎蛋网的"玩转firefox侧栏",才注意到它. Firefox侧栏有啥不一样? Firefox可以在侧栏中打开网页. 于是,一系列玩法就出来了... 侧栏打开在线应用 G ...

  6. 直接地址跳转C实现

    <C缺陷和陷阱>讲过的一种方法: ( *( void (*)() ) 0 )(); //跳转到0地址执行 解析: 1.void (*p_fun)(void); //声明函数指针 2.voi ...

  7. setAdapter(adapter)空指针nullPointer 解决办法

    setAdapter(adapter)空指针nullPointer 解决办法 (2014-06-13 10:01:23) 转载▼ 标签: 旅游 分类: Android开发 如果setAdapter报空 ...

  8. DDMS files not found:hprof-conv.exe的解决办法

    或者是you must restart adb and eclipse这类错误 原因:一般是豌豆荚之类的软件影响的,所以,以后要慎用了. 解决方案:先找一下在sdk\tools目录下是否有hprof- ...

  9. Asp.Net的核心对象

    原文地址:http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html 1.HttpRuntime 对象在处理Http请求的asp.ne ...

  10. Remove Nth Node From End of List 解答

    Question Given a linked list, remove the nth node from the end of list and return its head. For exam ...