Многопоточность в PL/SQL

В PL/SQL для параллельной обработки данных есть следующие способы:

DBMS_SCHEDULER (новее)
DBMS_JOB (устарело)
Parallel Query
DBMS_PARALLEL_EXECUTE в Oracle 11gR2 для UPDATE

С помощью DBMS_SCHEDULER  можно запускать параллельно много процедур в фоновом режиме. Принцип работы примерной процедуры:

1. Создаются задачи в указанном количестве (nJOBS number := 3)

2. Запускаются все эти созданные задачи.

3. Рекурсивно каждые 5 сек проверяется состояние этих задач до тех пор пока не завершатся.

4. После завершения все эти задачи удаляются.

create or replace procedure P_THREAD_TEST is

nJOBS number := 3;
sJOB_ACTION varchar2(200);

procedure P_JOB_SESSION(sACTION in varchar2) as
nCNT number;
begin
begin
--select 1 into nCNT from v$session v where v.ACTION = sACTION;
SELECT 1 into nCNT FROM USER_SCHEDULER_JOBS WHERE job_name = sACTION AND STATE='RUNNING';
exception
when others then
nCNT := 0;
end;
if (nCNT > 0) then
SYS.DBMS_LOCK.SLEEP(5);
--рекурсия
P_JOB_SESSION(sACTION);
end if;
end P_JOB_SESSION;

procedure P_CREATE_JOB as
begin
sJOB_ACTION:='begin
SYS.DBMS_LOCK.SLEEP(30);
end;';
for i in 1 .. nJOBS loop
sys.dbms_scheduler.create_job(job_name => 'JOB_UPD_' || i,
job_type => 'PLSQL_BLOCK',
job_action => sJOB_ACTION);
end loop;
end;

procedure P_RUN_JOB as
begin
for i in 1 .. nJOBS loop
dbms_scheduler.run_job('JOB_UPD_' || i, false);
end loop;
end;

procedure P_DROP_JOB as
begin
for i in 1 .. nJOBS loop
dbms_scheduler.drop_job('JOB_UPD_' || i, TRUE);
end loop;
end;

begin
P_CREATE_JOB;
P_RUN_JOB;
SYS.DBMS_LOCK.SLEEP(5);
for i in 1 .. nJOBS loop
P_JOB_SESSION('JOB_UPD_' || i);
end loop;
P_DROP_JOB;

end P_THREAD_TEST;