Oracle PL/SQL UTL_FILE.LEGEN Sie die Pufferung
Schreibe ich eine große Datei > 7MB aus einer Oracle-gespeicherten Prozedur, und die Anforderungen sind zu haben, die keine Beendigung der Zeile-Zeichen (kein carriage return/line feed) am Ende jedes Datensatzes.
Ich geschrieben habe, eine gespeicherte Prozedur mit UTL_FILE.SETZEN und ich bin nach jedem Aufruf von UTL_FILE.SETZEN Sie mit UTL_FILE.FFLUSH. Dieses Verfahren Fehler mit einem Fehler beim schreiben, sobald ich zu dem Punkt, wo ich geschrieben habe, mehr als die Größe des Puffers setzen (max 32767) obwohl, ich mache das FFLUSH Anrufe. Das Verfahren funktioniert gut, wenn ich ersetzen Sie die PUT-Aufrufe mit PUT_LINE Anrufe.
Ist es nicht möglich, mehr zu schreiben als die Größe des Puffers ohne ein newline-Zeichen? Wenn ja, gibt es eine Arbeit um?
InformationsquelleAutor Dustin | 2011-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dustin,
In der Oracle-Dokumentation hier:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404
Besagt, dass:
FFLUSH physisch schreibt anstehenden Daten in die Datei identifiziert, die durch das Datei-handle. Normalerweise werden Daten, die geschrieben werden in einer Datei gepuffert ist. Die FFLUSH Verfahren wird, werden die gepufferten Daten in die Datei geschrieben werden. Die Daten müssen mit einem Zeilenendezeichen abgeschlossen.
Den letzten Satz werden die meisten relevanten.
Konnte Sie nicht schreiben, die Daten mit UTL_FILE.PUT_LINE vor, dann suchen Sie die resultierende Datei für die Zeilenende-Zeichen und entfernen Sie Sie?
Nur so ein Gedanke....
Hi @Ollie , ich bin immer noch verwirrt darüber, wie FFLUSH funktioniert, für(1-->32767 +n), jedes mal, wenn ich, und ich fflush. Warum sollte eine neue Zeile noch gebraucht ? Würden Sie helfen, zu erklären?
InformationsquelleAutor Ollie
gelöscht Zitat von docs, siehe ollies Antwort
Ein weiterer möglicher Weg, dies zu tun ist eine gespeicherte Java-Prozedur, mit denen Sie die mehr voll funktionsfähige Java-API für das erstellen und schreiben von Dateien.
Ich bin fasziniert von der java-stored procedure. Obwohl ich glaube, dass der Java-code selbst wäre einfach, wir tun das nicht alle java-Programmierung in unserem shop, so würde es eine Wartungs-Ausgabe für jemanden abholen müssen.
Würden Sie bitte helfen Sie, zu erklären, wie wir dieses problem beheben können, mit BFILE-Objekt?
eigentlich denke ich, ich war falsch über die. Ich glaube, dass BFILEs sind schreibgeschützt, so konnte nicht verwendet werden, um Daten zu schreiben, um ein OS-Datei.
InformationsquelleAutor Dave Costa
Obwohl es ist weniger als wünschenswert, könnte man immer
PUT
bis Sie erkannt haben, dass Sie kurz vor der buffer-Größe. Wenn dies geschieht, können SieFCLOSE
den Datei-handle (das leeren der Puffer) und re-öffnen Sie diese Datei mitFOPEN
mit'a'
(append) Modus. Wieder, diese Technik sollte in der Regel vermieden werden, vor allem wenn andere Prozesse werden auch versuchen, auf die Datei zuzugreifen (Beispiel: das schließen einer Datei in der Regel hebt alle sperren des Prozesses hatte darauf gesetzt, zu befreien, bis alle anderen Prozesse, die versuchten, eine Sperre erwerben).InformationsquelleAutor Adam Paynter
Danke für all die tollen Antworten, Sie waren sehr hilfreich. Die gespeicherte java-Prozedur sah aus wie der Weg zu gehen, aber da wir nicht haben eine Menge von java-know-how im Haus haben, wäre es verpönt, die durch das management. Aber, ich war in der Lage, einen Weg finden, um dies zu tun, die von der gespeicherten Prozedur. Ich hatte zum öffnen der Datei im write-byte Modus 'WB'. Dann, für jede Platte, die ich Schreibe, um die Datei, die ich konvertieren der RAW-Datentyp mit UTL_RAW.CAST_TO_RAW. Dann nutzen Sie UTL_FILE.PUT_RAW zum schreiben in die Datei, gefolgt von einer notwendig FFLUSH fordert die Puffer zu leeren. Das empfangende system in der Lage, die files zu Lesen; so weit, so gut.
InformationsquelleAutor Dustin