我有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。
答案 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