Frage

Ich habe eine Reihe von PL/SQL -Verfahren, deren Ausführung mehrere Minuten dauern kann. Während der Entwicklung habe ich einige Druckanweisungen hinzugefügt, um das Debuggen zu unterstützen und einige Feedback- und Fortschrittsindikatoren zu geben. Anfangs habe ich diese bei kleinen Testsätzen durchgeführt und die Ausgabe war fast augenblicklich. Jetzt, da ich mit größeren Testsätzen teste, deren Ausführung mehrere Minuten dauert, finde ich, dass das Drucken zur Konsole nicht mehr geeignet ist, da nichts gedruckt wird, bis das Verfahren endet. Ich bin es gewohnt, in Umgebungen zu arbeiten, die ihre Ausgabe nicht pufferen und sofort drucken, und es ist häufig vorhanden, einfache Druckeinrichtungen für einfaches Debuggen und Diagnose hinzuzufügen.

Ist es in PL/SQL möglich, die Ausgabe sofort zu drucken (nicht gepuffert)? Wenn nicht, welche Alternativen empfehlen Menschen, ein ähnliches Ergebnis zu erzielen?

War es hilfreich?

Lösung

Sie können eine Prozedur haben, die Nachrichten mit einer autonomen Transaktion in eine Tabelle schreibt, die so etwas wie folgt:

procedure log (p_message)
is
    pragma autonomous_transaction;
begin
    insert into message_log (user, datetime, message)
    values (user, sysdate, p_message);
    commit;
end;

Überwachen Sie dann die Tabelle von einer anderen Oracle -Sitzung.

Andere Tipps

Wir haben einen kleinen Trick dafür.

Sie können dbms_application_info.set_client_info ("Einige Informationen hier") verwenden; Erstellen Sie einige Variablen und ersetzen Sie die Zeichenfolge in "".

Verwenden Sie SELECT client_info aus v $ session, um den Fortschritt zu überwachen.

Ich habe DBMS_PIPE für diesen Zweck verwendet. Senden Sie Nachrichten an eine benannte Pipe und lesen Sie sie aus einer anderen Sitzung. Diese Methode funktioniert möglicherweise nicht in einer RAC -Umgebung, wenn die Schreib- und Leseprozesse eine Verbindung zu einem anderen Knoten herstellen können.

Alternativ können Sie Nachrichten mit einer Prozedur in eine Tabelle einfügen, die in einer eigenen Sitzung mit "Pragma autonomous_transaction" ausgeführt wird. Sie können diese Nachrichten aus einer anderen Sitzung abfragen

Bearbeiten: Ich sehe, dass meine zweite Option bereits erwähnt wurde.

Es gibt im Allgemeinen zwei Optionen:

  • Senden Sie die Ausgabe an eine Orakeltabelle (oder temporäre Tabelle)
  • Schreiben Sie mit utl_file in das Dateisystem (Datenbankhost)

Wenn Sie keinen OS-Zugriff auf den Datenbankhost haben, können Sie weiterhin an das DBHost-Dateisystem schreiben und eine externde definierte Oracle-Tabelle an die Datei binden, damit sie mit einem Auswahl abgefragt werden kann.

Es kann von Ihrem Client -Tool abhängen. Ich habe SQL*Plus seit einiger Zeit nicht mehr verwendet, aber wenn ich die Prozeduren im PL/SQL -Entwickler debugging, öffne ich ein Befehlsfenster und stelle a ein SET SERVEROUTPUT ON Befehl. Dann, wenn ich die Prozedur ausführe, alles gedruckt von von gedrucktem von DBMS_OUTPUT.PUT_LINE zeigt sich sofort.

Bearbeiten: Sie haben Recht, ich glaube, ich habe das nur mit größeren Ausgaben oder so gesehen. Jedenfalls habe ich online gesucht und darauf gestoßen log4plsql - könnte nützlich sein.

Eine Alternative besteht darin, eine pipelierte Funktion zu verwenden, die Ihre Protokollierungsinformationen zurückgibt. Ein Beispiel finden Sie hier: http://berxblog.blogspot.com/2009/01/pipelined-function-vs-dbmsoutput.html Wenn Sie eine pipelierte Funktion verwenden, müssen Sie keine andere SQLPLUS/Toad/SQL -Entwickler usw. verwenden.

Sie können DBMS Pipe und den Pipe -Viewer in PL/SQL -Entwickler verwenden, um alle Infos asynchron zu fangen, wenn sie in das Rohr gelegt werden.

Seien Sie vorsichtig, wenn Sie Dinge nur in eine Pfeife stecken, wenn jemand sie lesen kann. Andernfalls schlägt Ihr Anruf fehl, wenn das Rohr voll ist.

Es besteht auch die Möglichkeit, Ereignisse zu verwenden, PL/SQL -Entwickler hat auch einen Ereignismonitor. Und die Dokumente sollten ein Beispiel dafür geben, wie es geht.

Eine andere Option ist, dass Ihr PL/SQL eine Prozedur aufruft, um eine E -Mail mit der darin enthaltenen Protokollnachricht zu senden. Dies erfordert, dass in Ihrer Datenbank eine E -Mail -Sendefunktion verfügt, die mit UTL_SMTP hinzugefügt werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top