2016-03-17 4 views
2

Я мастер хранимую процедуру:Run хранимые процедуры паралельно

MASTER(); 

В этой хранимой процедуре, я называю 3 других хранимых процедур:

SP1(); 
SP2(); 
SP3(); 

прямо сейчас, он работает последовательно, то есть один за другой. Я хочу запустить его параллельно, и как только все 3 хранимые процедуры будут полностью выполнены, запустите следующую часть хранимой процедуры MASTER().

Я использую Oracle Standard One Edition 11.2. Как я могу это достичь?

+0

Надеюсь, что это поможет http://stackoverflow.com/questions/34947855/run-execute-multiple-procedures-in-paralel-oracle/34951266#34951266 –

+1

Вы можете найти их интерес: HTTP://stackoverflow.com/questions/576802/can-we-use-threading-in-pl-sql и http://stackoverflow.com/questions/8213415/implementing-multithreading-in-oracle-procedures. –

ответ

1

Один из способов архивирования, который должен использовать DBMS_JOB или DBMS_SCHEDULER для запуска параллельных процедур и DBMS_ALERT, чтобы уведомить мастер-процедуру, когда они закончены.

0

Существует другой способ достичь этого.

Настройка envirement:

create table t_procedure(id number, procedures varchar2(200)); 

create type l_char is table of varchar2(100); 

create procedure goSleeep(p_sec number)is 
begin 
dbms_lock.sleep(p_sec); 
end; 

Пакет:

create or replace package goParallel is 
TYPE t_referential_cursor IS REF CURSOR RETURN t_procedure%ROWTYPE; 

function runParallel(p_cursor  t_referential_cursor) 
    return l_char pipelined  
     parallel_enable(partition p_cursor BY HASH(id)); 
end; 

create or replace package body goParallel is 

function runParallel(p_cursor  t_referential_cursor) 
    return l_char pipelined  
     parallel_enable(partition p_cursor BY HASH(id)) 
is 
v_start date := sysdate; 
v_end date; 
vid number; 
p_proc varchar2(200); 
begin 
loop 
    fetch p_cursor into vid, p_proc; 
     exit when p_cursor%notfound; 
     execute immediate p_proc; 
     v_end := sysdate; 
     pipe row(vid||' --- '||to_char(v_start,'HH24:MI:SS')||' - '|| to_char(v_end,'HH24:MI:SS')); 
    end loop; 
    return; 
end; 

end; 

Вставьте некоторые процедуры для запуска.

insert into t_procedure values (1, 'begin goSleeep(5); end;'); 
insert into t_procedure values (2, 'begin goSleeep(8); end;'); 
insert into t_procedure values (3, 'begin goSleeep(9); end;'); 
commit; 

И запустить его странным способом.

select * from table(goParallel.runParallel(cursor(select /*+ PARALLEL(a 8) */ * from t_procedure a))); 
-- result: id - start - end 
     1 --- 12:15:54 - 12:15:59 
     2 --- 12:15:54 - 12:16:02 
     3 --- 12:15:54 - 12:16:03 
Смежные вопросы