PL/SQL, Fehler bei Datenausgabe in Datei

Hallo,

ich habe ein Problem mit einem PL/SQL-Skript.
Das Skript soll Sätze einer Datenbanktabelle in eine Datei
ausgeben.

Es hat folgende Struktur:
set linesize 256
set serverout on
set termout off
set serveroutput on size 1000000
spool T:\sql\ausgabedatei.txt
declare

begin

dbms_output.put_line(…);

end;
spool off

Ich starte es in SQL+ Oracle 10 mit „start H:\sql\myfile.sql“
Es wird eine 2283KB große Ausgabedatei erstellt und auch mit
Daten gefüllt. Jedoch bricht das Skript nach ca. 9050 Zeilen ab
und bringt die Meldung:

FEHLER in Zeile 1:
ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes
ORA-06512: in „SYS.DBMS_OUTPUT“, Zeile 32
ORA-06512: in „SYS.DBMS_OUTPUT“, Zeile 97
ORA-06512: in „SYS.DBMS_OUTPUT“, Zeile 112
ORA-06512: in Zeile 459

Ich habe dann versucht den Wert 1000000 bei
„set serveroutput on size 1000000“
weiter zu erhöhen, jedoch scheint es, dass bei 1000000 das Maximum
erreicht ist, denn trotz Einstellung eines höheren Wertes erscheint
in der Fehlermeldung stets die Zahl 1000000.

Meine Fragen:
Wie erreiche ich, dass die Ausgabedatei vollständig erstellt wird?
Ist der Befehl dbms_output.put_line für diesen Zweck geeignet oder
gibt es noch eine andere Möglichkeit Ausgabedateien zu erstellen?

Es würde mich sehr freuen wenn jemand mir weiterhelfen könnte.

Gruß
Lorenz

Hallo Lorenz,

tja, am Limit für DBMS_OUTPUT kommt man wohl nicht vorbei…

Du könntest natürlich innerhalb des PL/SQL-Blocks das, was du bisher per DBMS_OUTPUT ausgibst, in eine eigene Logging-Tabelle schreiben. Wenn deine Arbeit erledigt ist, kannst du dann einfach den Inhalt dieser Datei per SPOOL in eine Datei selektieren.

Es grüßt und ist für bessere Vorschläge dankbar:
Guido

Hi!

Ich habe dann versucht den Wert 1000000 bei
„set serveroutput on size 1000000“
weiter zu erhöhen, jedoch scheint es, dass bei 1000000 das
Maximum
erreicht ist, denn trotz Einstellung eines höheren Wertes
erscheint
in der Fehlermeldung stets die Zahl 1000000.

Das wundert mich eigentlich, denn höhere Werte sind möglich.

Eine weitere Möglichkeit wäre es, die Ausgabe direkt in ein File zu schreiben. Jedoch hier kannst Du
a) nur auf jene Verzeichnisse schreiben, die dem DB-Server bekannt sind und außerdem
b) benötigst Du natürlich eine Schreibberechtigung.

Da ich das ganze in einem wiederverwendbaren Package habe und das DBMS-Package nie direkt aufrufe, weiß ich jetzt natürlich nicht auswendig, welches Package es genau ist; es ist jedoch das Datenbankanaloge zum Forms-TEXT_IO-Package

Grüße,
Tomh

Hi!

Eine weitere Möglichkeit wäre es, die Ausgabe direkt in ein
File zu schreiben. Jedoch hier kannst Du
a) nur auf jene Verzeichnisse schreiben, die dem DB-Server
bekannt sind und außerdem
b) benötigst Du natürlich eine Schreibberechtigung.

Da ich das ganze in einem wiederverwendbaren Package habe und
das DBMS-Package nie direkt aufrufe, weiß ich jetzt natürlich
nicht auswendig, welches Package es genau ist; es ist jedoch
das Datenbankanaloge zum Forms-TEXT_IO-Package

–> Das Package, welches du meinst, wäre das UTL_FILE, und das wäre meiner Ansicht nach auch die korrekte Lösung für diese Problem, ausser das halt auf den Server geschrieben wird

Danke für die Hinweise.
Die Methode mit UTL_FILE direkt in ein File zu schreiben
würde mir am besten gefallen. Da ich dieses Skript aber
zur Fehleranalyse bei diversen Kunden laufen lassen will
bei denen ich mich mittels Fernwartung aufschalte, kann
ich nicht davon ausgehen, dass mein Ausgabeverzeichnis
dem DB-Server bekannt ist. Wie man so ein Verzeichnis
evtl. einrichten kann, weiss ich leider auch nicht.
Deshalbe werde ich die Ausgaben in eine eigene Tabelle
schreiben und diese dann mit spool in eine Datei ausgeben.

Ich habe mir bisher so geholfen, dass ich das Skript zweimal
gestartet habe und durch Vorgabe von bestimmten Eingabepara-
metern jeweils nur ein Teil des Datenbestandes ausgewertet habe.
Dadurch wurden zwei Ausgabedateien erzeugt, die von der Größe
ohne buffer overflow erzeugt werden konnten.
Dies ist jedoch nicht sehr elegant, da nächstes Mal vielleicht
eine Halbierung auch nicht mehr ausreicht.

Danke nochmal an alle für die Tips.
Gruß Lorenz

Hi!

–> Das Package, welches du meinst, wäre das UTL_FILE, und
das wäre meiner Ansicht nach auch die korrekte Lösung für
diese Problem, ausser das halt auf den Server geschrieben wird

Wie kurzlebig doch manch Wissen ist … allerdings der ORA.INI-Eintrag „UTL_FILE_DIR“ (_unbedingt_ eintragen, sonst funktinoiert’s nicht) hätte mich auf den Namen des Packages bringen müssen

Danke,
Tomh