oracle存储过程通过JOB来实现并行执行

Posted robot_sql

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle存储过程通过JOB来实现并行执行相关的知识,希望对你有一定的参考价值。

1、oracle版本为10G及以上,由于网上很多都没有完善,所以特此完善记录下来,仅供参考

需求:多个无依赖关系的存储过程并行执行(使用该功能前测试下服务器情况,貌似并行任务和数据库的CPU个数有直接关系,小于等于CPU个数*4)。

实现思路:在存储过程中创建任务,以便能直接通过JAVA输入动态参数调用。

第一步:建测试表

create table A ( A INTEGER);

第二步:创建存储过程

create or replace procedure test1

(
    i_tjrq   in    number,    --统计日期
    i_err_no out number   --输出参数
)
as
begin
insert into a values(i_tjrq);
end;


create or replace procedure test2
(
    i_tjrq   in    number,     --统计日期
        i_err_no out number   --输出参数
)
as
begin
insert into a values(i_tjrq);
end;



第三步:在存储过程中创建任务,以便操作

CREATE OR REPLACE PROCEDURE test3 (i_tjrq IN NUMBER)  as
x   NUMBER;
--m varchar2(100):='declare i_err_no NUMBER;begin test2('||i_tjrq||',i_err_no);test1('||i_tjrq||',i_err_no); end;';
BEGIN
   --SYS.DBMS_OUTPUT.put_line(m);
   sys.DBMS_JOB.submit (
      job         => x,
      what        => 'declare i_err_no NUMBER;begin test2('||i_tjrq||',i_err_no);test1('||i_tjrq||',i_err_no); end;',
      next_date   => TO_DATE ('14-05-2013 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
      interval    => 'trunc(sysdate+1)',
      no_parse    => FALSE);
   --SYS.DBMS_OUTPUT.put_line ('Job Number is: ' || TO_CHAR (x));
  
   COMMIT;
END;


--值得注意的是sys.DBMS_JOB.submit()里面的参数只在这里做简单的介绍

job是任务号--系统自行生成

what是可以存储pl/sql代码的函数,动态输入的变量可以在此拼接。

其他参数直接参考oracle官方文档或者自行搜索,就不一一叙述了。


select * from user_jobs 可以查看你用户名下任务的jobid 也就是上面的任务号,单个执行任务用下列语句实现。

begin
--dbms_job.remove(39); --删除任务
dbms_job.run(39);  --运行任务
end;

由于是直接创建在存储过程里面的,所以直接调用存储过程即可插入当天的数据。

begin
  -- Call the procedure
  test3(i_tjrq => :i_tjrq);
end;  --或者直接在pl/sql工具里面执行,查看a表你会发现系统数据已经插入。


以上是关于oracle存储过程通过JOB来实现并行执行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 10g实现存储过程异步调用

并行执行 oracle PL/SQL [重复]

oracle中如何创建一个job

oracle定时执行存储过程的时间区间问题

使用 dbms_job 在包内执行 oracle 中的存储过程

Oracle ETL日志审计存储过程示例