首页 文章

在Oracle过程中实现多线程

提问于
浏览
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 但是我无法弄清楚,如何在循环中使用它们 .

有人能引导我朝正确的方向发展吗?

谢谢,Ankur

2 回答

  • 3

    你能做的就是同时提交大量工作 . 见Example 28-2 Creating a Set of Lightweight Jobs in a Single Transaction

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

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

  • 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之后使用提交将并行启动作业(以及程序) .

相关问题