oracle存储过程通过JOB来实现并行执行_u012209894的专栏-CSDN博客
- -1、oracle版本为10G及以上,由于网上很多都没有完善,所以特此完善记录下来,仅供参考. 需求:多个无依赖关系的存储过程并行执行(使用该功能前测试下服务器情况,貌似并行任务和数据库的CPU个数有直接关系,小于等于CPU个数*4). 实现思路:在存储过程中创建任务,以便能直接通过JAVA输入动态参数调用.
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
-- Call the procedure
test3(i_tjrq => :i_tjrq);
end; --或者直接在pl/sql工具里面执行,查看a表你会发现系统数据已经插入。