2011-11-21 121 views
4

我正在使用Oracle 10gR2。在Oracle过程中实现多线程

这里是我的问题 -

我有一个程序,让叫它* proc_parent *(包内),这是应该调用其他程序,让叫它* user_creation *。我必须在循环内部调用* user_creation *,该循环正在读取表中的某些列 - 并将这些列值作为参数传递给* user_creation *过程。

的代码是这样的:

FOR i IN (SELECT community_id, 
         password, 
         username 
       FROM  customer 
       WHERE community_id IS NOT NULL 
       AND  created_by = 'SRC_GLOB' 
      ) 
    LOOP 
     user_creation (i.community_id,i.password,i.username); 
    END LOOP; 

COMMIT; 

user_Creation程序调用Web服务的一些业务逻辑,然后根据该响应更新的表。

我需要找到一种方法,我可以在这里使用多线程,这样我就可以运行此过程的多个实例来加快速度。我知道我可以使用* DBMS_SCHEDULER *和可能* DBMS_ALERT *但我无法弄清楚,如何在循环内使用它们。

有人可以引导我在正确的方向吗?

感谢, ANKUR

回答

1

我想关闭这个问题。 DBMS_SCHEDULER以及DBMS_JOB(尽管DBMS_SCHEDULER是首选)可以在循环内用于提交和执行作业。

例如,这里是一个示例代码,用DBMS_JOB其可以在一个循环内被调用:

... 
FOR i IN (SELECT community_id, 
       password, 
       username 
      FROM customer 
      WHERE community_id IS NOT NULL 
      AND created_by = 'SRC_GLOB' 
     ) 
LOOP 
DBMS_JOB.SUBMIT(JOB => jobnum, 
       WHAT => 'BEGIN user_creation (i.community_id,i.password,i.username); END;'  
COMMIT; 
END LOOP; 

使用提交SUBMIT之后将揭开在平行作业(并且因此过程)。

3

你可以做的是在同一时间提交大量的就业机会。请参阅Example 28-2 Creating a Set of Lightweight Jobs in a Single Transaction

这样就可以在同一时间填写您想在一个tx中提交的所有作业的pl/sql表。只要它们被提交(启用),它们就会开始运行,系统可以处理的数量或资源管理器计划允许的数量。

轻量级作业的开销非常小......轻。