4

我正在研究 Oracle 10gR2。

这是我的问题-

我有一个过程,我们称之为*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*但我无法弄清楚如何在循环中使用它们。

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

谢谢, 安库尔

4

2 回答 2

3

你可以做的是同时提交很多工作。请参见示例 28-2 在单个事务中创建一组轻量级作业

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

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

于 2011-11-21T17:00:50.170 回答
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之后使用提交将并行启动工作(并因此启动过程)。

于 2012-06-05T05:40:35.603 回答