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

时间:2022-09-08 19:57:05

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表你会发现系统数据已经插入。