使用Oracle排队

时间:2017-11-08 11:49:52

标签: oracle plsql dbms-scheduler queuing

我想执行一个对一组给定表执行更新的过程。在这种情况下11个表。这里使用关联数组只是因为用于与过程中的表的连接的列的名称在相关表中是不同的:

Declare
  TYPE associative_array IS TABLE OF VARCHAR(100) INDEX BY VARCHAR2(100);
   table_array associative_array;
   l_key VARCHAR2(100);
Begin
  table_array('TABLE1'):='MY_ID1';  --  1
  table_array('TABLE2'):='MY_ID2';  --  2
  table_array('TABLE3'):='MY_ID1';  --  3
  table_array('TABLE4'):='MY_ID1';  --  4
  table_array('TABLE5'):='MY_ID1';  --  5
  table_array('TABLE6'):='MY_ID1';  --  6
  table_array('TABLE7'):='MY_ID2';  --  7
  table_array('TABLE8'):='MY_ID2';  --  8
  table_array('TABLE9'):='MY_ID2';  --  9
  table_array('TABLE10'):='MY_ID1'; -- 10 
  table_array('TABLE11'):='MY_ID1'; -- 11 

   l_key := table_array.first;
   while (l_key is not null) loop
      execute immediate 'MY_UPDATE_PROCEDURE(''' || l_key || ',' || table_array(l_key)||''')'; -- calling a procedure which performes updates on tables
      l_key := table_array.next(l_key);
   end loop;
end;

现在,出于性能原因,我希望并行执行4个过程,因此DBMS_SCHEDULER可能是最佳选择。棘手的事情:假设4个程序正在运行。在某个时刻,当一个或多个实例完成时,我立即想要执行另一个实例,这样总是会运行最大数量的实例(例如4个由于自己的定义),直到所有表都被处理完毕。

怎样才能实现这种排队?

1 个答案:

答案 0 :(得分:1)

这可能是一种方法:TemplateRenderer 看起来您应该能够设置一个程序来安排作业,监控它们,并使用作业状态事件来跟踪运行的数量,并安排新的运行完成旧的