在oracle中并行运行作业

时间:2015-09-16 04:41:04

标签: multithreading oracle plsql parallel-processing

我有8个工作要运行。在任何情况下,必须有4个工作正在运行。其中一个示例作业如下:

Job_ID

其他7个类似的工作只在CREATE OR REPLACE PROCEDURE sp_ProcessJobs AS vblSQL VARCHAR2(32767); vblTotalJobs VARCHAR2(1000); vblRemJobs VARCHAR2(1000); vblJob1 VARCHAR2(1000); vblJob2 VARCHAR2(1000); vblJob3 VARCHAR2(1000); vblJob4 VARCHAR2(1000); vblJob VARCHAR2(1000); lno NUMBER; BEGIN SELECT Count(*) INTO vblTotalJobs FROM jobs WHERE status='N'; FOR i IN 1..4 LOOP SELECT jobname INTO vblJob FROM (SELECT job_id,status,jobname,Rank() OVER (ORDER by job_id)rnk FROM (SELECT * from jobs WHERE status='N' ORDER BY job_id) )WHERE rnk=i; IF i=1 THEN vbljob1:=vbljob; ELSIF i=2 THEN vbljob2:=vbljob; ELSIF i=3 THEN vbljob3:=vbljob; ELSIF i=4 THEN vbljob4:=vbljob; END IF; END LOOP; Dbms_Job.submit(lno,'BEGIN '||vbljob1||'; END;'); COMMIT; Dbms_Job.submit(lno,'BEGIN '||vbljob2||'; END;'); COMMIT; Dbms_Job.submit(lno,'BEGIN '||vbljob3||'; END;'); COMMIT; Dbms_Job.submit(lno,'BEGIN '||vbljob4||'; END;'); COMMIT; Dbms_Output.put_line(vblTotalJobs); END; 中有所不同。我编写了一个代码,用于初始化四个作业,以便立即运行。这是代码:

  var pop = (from po in ctx.PurchaseOrders
       select new SearchItem
        {
          id = po.PurchaseOrderID,
          label = po.SupplierID.ToString, // or   Convert.Tostring(po.SupplierID)
          category = "purchaseorder"
       }).ToList();

这允许我一次并行运行四个作业。现在,如果一个工作完成,我应该怎么办另一份工作(比如第5号工作),等等。每次我尝试这样做,程序进入一个无限循环,我必须杀死会话以阻止它。

我想要实现的是类似于JAVA或其他编程语言中的线程。任何帮助都将受到高度赞赏。

我正在使用Oracle。

2 个答案:

答案 0 :(得分:1)

如果你真的想要运行并行作业,你应该考虑DBMS_PARALLEL_EXECUTE,它可以让你更好地控制工作。

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_parallel_ex.htm#ARPLS233

答案 1 :(得分:0)

请检查 JOB_QUEUE_PROCESSES 是否符合您的要求?您可以将范围定义为4。

有关详情,请访问此网站 - http://docs.oracle.com/cd/B28359_01/server.111/b28320/initparams102.htm