2011-01-04 4 views
4

Ich suche nach dem Äquivalent von Java thread.join() in PL/SQL. I.e. Ich möchte eine Reihe von Jobs (Threads) starten und dann warten, bis sie fertig sind.Warten auf einen abgeschlossenen Job in Oracle PL/SQL?

Wie ist das in PL/SQL möglich?

Ich denke an dbms_job.submit (ich weiß, es ist veraltet). dbms_scheduler ist auch eine Alternative.

Mein Code:

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; 

Antwort

5

Ich mag die Lösung von Adam Hawkes mit DBMS_SCHEDULER Ketten. Wusste das nicht, da ich immer noch DBMS_JOB benutze und noch keinen Code umgeschrieben habe.

Wie auch immer ... die Lösung, die ich derzeit dafür verwende, ist eine Kombination aus DBMS_JOB (obwohl Sie wahrscheinlich DBMS_SCHEDULER verwenden sollten, da DBMS_JOB veraltet ist, wie Sie notiert haben) und DBMS_ALERT.

Jobs werden mit DBMS_JOB erstellt. Dann warten wir auf den Abschluss der Jobs mit dbms_alert.register und dbms_alert.waitany. Jeder Job verwendet nach seiner Fertigstellung dbms_alert.signal. Es kann ein Problem geben, wenn der Job abgeschlossen wird und signalisiert, bevor der Elternteil bereit ist, aber ich bin sicher, dass Sie das umgehen könnten.

Ich vermute, dass die DBMS_SCHEDULER-Ketten wahrscheinlich die Art sind, wie Sie dies jetzt tun sollten, aber ich füge nur meine Antwort für die Vollständigkeit hinzu.

+0

Eine ebenso gute Lösung, wenn Sie immer noch 'DBMS_JOB' anstelle von' DBMS_SCHEDULER' verwenden! –

+0

+1, nette Idee .. irgendwelche Ideen, wie ich auf die 2 Jobs warten würde (wie Sie erwähnt haben, gibt es eine Wahrscheinlichkeit, dass ein Job beendet wird, bevor der Waitany-Schritt aufgerufen wird). Eine Lösung, die mir einfällt, ist, dass beide Jobs dasselbe Ereignis werfen und dann zweimal auffliegen ... Alternativen? – vicsz

+0

WaitAny macht den Trick, wie Sie erwähnt haben. – vicsz

10

Dies wird erreicht, Ketten in der DBMS_SCHEDULER Job Scheduling verwenden. Die Oracle Documentation hat Beispiele, die erreichen, was Sie wollen. Grundsätzlich definieren Sie Schritte, kleine Codeabschnitte, mit einer Ausführungsstruktur. In Ihrem Beispiel wäre der erste Schritt ein Startschritt (der normalerweise die Initialisierung durchführt), dann hätten Sie zwei parallel laufende Schritte (jobno1 und jobno2) und dann einen letzten Schritt, der aktiviert wird, sobald beide parallelen Jobs abgeschlossen sind .

+0

+1, schön Ich wusste nicht über die Verkettung Fähigkeit in dbms_scheduler ... obwohl ich noch nicht sicher bin, wie ich auf die letzten 2 Schritte (parallel laufen) warten würde, um vor meinem Block meine beendet zu beenden. – vicsz

Verwandte Themen