2011-01-04 2 views
4

PL/SQL에서 Java의 thread.join()과 동일한 기능을 찾고 있습니다. 나는. 나는 많은 일자리 (실)를 시작하고 끝내기를 기다린다.제출 된 작업이 Oracle PL/SQL에서 완료되기를 기다리고 있습니까?

PL/SQL에서 어떻게 가능합니까?

나는 dbms_job.submit을 사용하려고 생각하고있다 (나는 deprecated를 알고있다). dbms_scheduler도 대안입니다.

내 코드 :

DECLARE 
    jobno1 number; 
    jobno2 number; 
BEGIN 

    dbms_job.submit(jobno1,'begin dbms_lock.sleep(10); dbms_output.put_line(''job 1 exit'');end;'); 
    dbms_job.submit(jobno2,'begin dbms_lock.sleep(10); dbms_output.put_line(''job 2 exit'');end;'); 

    dbms_job.run(jobno1); 
    dbms_job.run(jobno2); 

    //Need code to Wait for jobno1 to finish 
    //Need code to Wait for jobno2 to finish 

END; 

답변

5

DBMS_SCHEDULER 체인을 사용하는 Adam Hawkes의 솔루션을 좋아합니다. 아직 DBMS_JOB을 사용하고 있고 코드를 다시 작성하지 않았기 때문에 그것에 대해 알지 못했습니다.

어쨌든 ... 내가 현재 사용하고있는 솔루션은 DBMS_JOB (DBMS_JOB는주의해서 사용하지 않으므로 아마도 DBMS_SCHEDULER를 사용해야 함)와 DBMS_ALERT의 조합입니다.

작업은 DBMS_JOB을 사용하여 작성됩니다. 그런 다음 dbms_alert.register 및 dbms_alert.waitany를 사용하여 작업이 완료 될 때까지 기다립니다. 작업이 완료되면 dbms_alert.signal을 사용합니다. 작업이 완료되고 부모가 준비되기 전에 신호를 보내지 만 문제를 해결할 수 있다면 문제가있을 수 있습니다.

저는 DBMS_SCHEDULER 체인이 아마도 지금해야하는 방법 일 것이라고 추측하고 있지만 완전성을 위해 대답을 추가하고 있습니다.

+0

'DBMS_SCHEDULER' 대신에 여전히'DBMS_JOB'을 사용하고 있다면 똑같이 좋은 해결책입니다! –

+0

+1, 멋진 아이디어 .. 2 가지 작업이 끝날 때까지 기다리는 방법에 대한 아이디어 (waitany 단계가 시작되기 전에 작업이 끝날 확률이있을 것이라고 언급 한 것처럼). 내가 생각할 수있는 한 가지 해결책은 두 가지 일자리 모두 동일한 사건을 던지고 두 번 잡아라 ... 대안을 제시하는 것입니다. – vicsz

+0

WaitAny는 당신이 언급 한 것처럼 속임수를 씁니다. – vicsz

10

이것은 DBMS_SCHEDULER 작업 스케줄링에 체인을 사용하여 수행됩니다. Oracle Documentation에는 원하는 것을 성취하는 예제가 있습니다. 기본적으로 실행 구조로 단계, 코드의 작은 부분을 정의합니다. 예를 들어, 첫 번째 단계는 시작 단계 (일반적으로 초기화를 수행)이고, 두 단계는 병렬로 실행됩니다 (jobno1 및 jobno2). 그런 다음 병렬 작업이 완료되면 활성화 될 마지막 단계입니다. .

+0

+1, dbms_scheduler에서 체인 연결 기능에 대해 알지 못해서 좋은 점 ... 마지막 두 단계 (병렬 실행)를 기다리는 방법을 아직 잘 모르지만 내 블록이 완료되기 전에 완료해야합니다. – vicsz

관련 문제