2009-03-11 13 views

Antwort

7

Vielleicht eine dieser Optionen für Ihre Bedürfnisse (je nachdem, ob Sie etwas auf Server-Seite oder Client-Seite schreiben):

(Update von Mark Harrison) Ich ging mit dem my-dbms-output-Paket in die AskTom-Post. Ein wirklich nettes Feature ist, dass Sie über eine Ansicht auf die Ergebnisse zugreifen können, sodass Sie die Ausgabe in einem Client-Programm einfach anzeigen können. Ich habe es in einen kürzeren Namen umbenannt.

2

Sie können das TCP-Paket verwenden, um die Ausgabe an ein Terminal oder an einen Remote-Datenlogger zu schreiben. Ziemlich handhabbar für das Debuggen von Paketcode, der in geplanten Aufgaben ausgeführt wird.

Edit: Hier ist ein Beispiel Verfahren:

procedure pDebug(str in varchar2) 
-- output debugging message to display or tcp console 
    is 
x number; 
l number; 
nPort number; 
sAddress varchar2(5000); 
    begin 
if c_bDebug = 1 then 
    if c_tcpbDebug = 1 then 
     if cSocket.remote_host is NULL then 
      nPort := strMetaDataValue('TCP-DEBUG-PORT'); 
      sAddress := strMetaDataValue('TCP-DEBUG-ADDRESS'); 
      dbms_output.put_line('tcp:port ' || nPort); 
      dbms_output.put_line('tcp:address ' || sAddress); 
      if length(sAddress) > 1 and nvl(nPort, 0) > 0 then 
       begin 
       dbms_output.put_line('tcp:open start ' ||to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS')); 
       cSocket := utl_tcp.open_connection(sAddress, nPort); -- open connection 
       dbms_output.put_line('tcp:open ' || to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS')); 
       c_tcpbDebug := 1; 
       exception 
        when others then 
         dbms_output.put_line(SQLERRM); 
         dbms_output.put_line('Cant open debug tcp session ' || SYSTIMESTAMp); 
         c_tcpbDebug := 0; 
       end; 
      else 
       c_tcpbDebug := 0; 
      end if; 
     end if;   

     if cSocket.remote_host is not NULL then 
      dbms_output.put_line('tcp:write'); 
      x := utl_tcp.write_line(cSocket, to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || ' ' || str); 
      x := utl_tcp.write_line(cSocket, utl_tcp.crlf); 
     end if; 
    end if; 
-- this bit prints out the debug statement in 254 char bits 
    l := length(str); 
    x := 1; 
    while x <= l loop 
     dbms_output.put_line(substr(str,x,254)); 
     x := x + 254; 
    end loop; 
end if; 
end pDebug; 
+0

Interessant, haben Sie ein Beispiel dafür? Vielen Dank! –

6

Welche Version von Oracle? Beide Einschränkungen wurden in den letzten Versionen gelockert. 10.2 unterstützt Zeilen, die länger als 255 Zeichen sind (das neue Limit ist 32k) und eliminiert die maximale Puffergrößenbeschränkung. Oracle 9.2 hatte die 255 Zeichen pro Zeile/1 MB Gesamtlimit, aber Oracle hat diese Version nicht unterstützt.

1

Eine andere Möglichkeit, obwohl wahrscheinlich keine gute, besteht darin, in das Alarmprotokoll zu schreiben.

sys.dbms_system.ksdwrt(2,to_char(sysdate)|| ' -- The message '); 
2

INSERT ist eine fantastische Alternative. Sie erhalten nicht nur die Informationen aus Ihrem Prozess, es bleibt für zukünftige Referenz oder Analyse bestehen. Und die Ergebnisse können mit einer sehr gebräuchlichen Sprache namens SQL abgerufen und gefiltert und verarbeitet werden. Sie könnten eine Spalte mit einem Standardwert von sysdate haben, um Zeit und Reihenfolge zu überprüfen. Es kann innerhalb einer autonomen Transaktion platziert werden, um zu vermeiden, dass die Protokollierung aufgrund eines Rollbacks verloren geht.

1

Eine Einschränkung von dbms_output ist, dass die Ausgabe erst verfügbar wird, nachdem die Anweisung beendet wurde. Um lange laufende Prozesse im Auge zu behalten, verwende ich dbms_pipe, um Statusmeldungen zu versenden. Am anderen Ende der Leitung können Sie dann sehen, was der Prozess vorhat.