insbesondere eine, die nicht die 256 max Zeichen/Zeile und 1000000 max Zeichen/Puffer-Beschränkung hat.Oracle: irgendwelche Ersetzungen für DBMS_OUTPUT-Paket?
Antwort
Vielleicht eine dieser Optionen für Ihre Bedürfnisse (je nachdem, ob Sie etwas auf Server-Seite oder Client-Seite schreiben):
- UTL_FILE
- Text_IO
- AskTom post
(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.
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;
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.
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 ');
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.
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.
Interessant, haben Sie ein Beispiel dafür? Vielen Dank! –