/*************************** Create syncronize table *************************/
create table PARALLEL_EXECUTIONS
(
JOBID NUMBER(13, 0) ,
PROCESSID NUMBER(13, 0) ,
PARENT_NAME VARCHAR2(50)
)
/
grant execute on dbms_lock to ... -- only for testing the procedure bellow
/
/*************************** Create procedure *************************/
create or replace procedure aggregate_in_parallel
as
v_job number;
v_parent_name parallel_executions.parent_name%type:='LOCK_SLEEP';
v_cnt number;
begin
dbms_job.submit( v_job, 'dbms_lock.sleep(30);' );
insert into parallel_executions(JOBID,PROCESSID,PARENT_NAME)
values (v_job,1,v_parent_name);
commit;
dbms_job.submit( v_job, 'dbms_lock.sleep(20);' );
insert into parallel_executions(JOBID,PROCESSID,PARENT_NAME)
values (v_job,2,v_parent_name);
commit;
dbms_job.submit( v_job, 'dbms_lock.sleep(10);' );
insert into parallel_executions(JOBID,PROCESSID,PARENT_NAME)
values (v_job,3,v_parent_name);
commit;
loop
dbms_lock.sleep(20);
delete from parallel_executions pe where not exists
(select 1 from user_jobs uj where uj.job=pe.jobid) and PARENT_NAME=v_parent_name;
commit;
select count(*) into v_cnt from parallel_executions where PARENT_NAME=v_parent_name;
exit when (v_cnt = 0);
end loop;
end;
/
/*************************** Test it *************************/
set serveroutput on
begin
aggregate_in_parallel;
dbms_output.put_line('Finish .... continue with others serial procedures ...');
end;
/
               (
geocities.com/aritonc)