Oracle PL/SQL UTL_FILE.METTRE de mise en mémoire tampon
Je suis en train d'écrire un gros fichier > 7MO à partir d'une procédure stockée Oracle et les exigences n'ont pas de terminaison de ligne personnages (pas de retour chariot/saut de ligne) à la fin de chaque enregistrement.
J'ai écrit une procédure stockée à l'aide de UTL_FILE.METTRE et je suis à la suite de chaque appel à UTL_FILE.METTRE avec un UTL_FILE.FFLUSH. Cette procédure erreurs avec une erreur d'écriture une fois que je suis au point où je l'ai écrit plus de la taille de la mémoire tampon (la valeur max 32767) bien que je suis en train de faire le FFLUSH appels. La procédure fonctionne très bien si je remplace le PLACER des appels avec PUT_LINE appels.
Est-il pas possible d'écrire plus de la taille de la mémoire tampon sans un caractère de saut de ligne? Si oui, est-il contourner?
OriginalL'auteur Dustin | 2011-08-26
Vous devez vous connecter pour publier un commentaire.
Dustin,
La documentation d'Oracle ici:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404
Stipule que:
FFLUSH écrit physiquement dans l'attente de données pour le fichier identifié par le descripteur de fichier. Normalement, les données écrites dans un fichier en mémoire tampon. Le FFLUSH procédure forces de données de la mémoire tampon pour être écrit dans le fichier. Les données doivent être terminés par un caractère de saut de ligne.
La dernière phrase étant la plus pertinente.
Vous ne pourriez pas vous écrire les données à l'aide de UTL_FILE.PUT_LINE avant de rechercher ensuite le fichier qui en résulte pour les terminateurs de ligne et de les retirer?
Juste une pensée....
Salut @Ollie , je suis encore confus sur la façon FFLUSH œuvres, pour(1-->32767 +n), à chaque fois que j'ai mis, et je fflush. Pourquoi une nouvelle ligne encore nécessaire ? Souhaitez-vous contribuer à expliquer?
OriginalL'auteur Ollie
supprimé la citation de documents, voir Ollie réponse
Un autre moyen pour ce faire est de Java procédure stockée, où vous pouvez utiliser la plus complète de l'API Java pour la création et l'écriture de fichiers.
Je suis intrigué par la java de la procédure stockée. Bien que je crois que le code Java lui-même serait très simple, nous n'avons pas le faire en java dans notre boutique, donc ce serait un problème d'entretien pour quelqu'un d'avoir à ramasser.
Voulez-vous s'il vous plaît aider à expliquer comment nous pouvons résoudre ce problème avec BFILE Objet?
en fait, je pense que j'ai été incorrect. Je crois que BFILEs sont en lecture seule et ne pouvais donc pas être utilisé pour écrire des données dans un fichier du système d'exploitation.
OriginalL'auteur Dave Costa
Bien qu'il est moins souhaitable, vous pouvez toujours
PUT
jusqu'à ce que vous avez détecté que vous vous approchez de la taille de la mémoire tampon. Lorsque cela se produit, vous pouvezFCLOSE
le descripteur de fichier (rinçage de la zone tampon) et de ré-ouvrir ce fichier avecFOPEN
à l'aide de'a'
(append) comme la mode. Là encore, cette technique doit généralement être évitée, surtout si d'autres procédés sont également de la tentative d'accès au fichier (par exemple: fermeture d'un fichier généralement révoque tous les verrous le processus avait mis sur elle, libérant de tous les autres processus qui ont été en essayant d'acquérir un verrou).OriginalL'auteur Adam Paynter
Merci pour toutes ces excellentes réponses, elles m'ont été très utiles. La java de la procédure stockée ressemblait à du chemin à faire, mais puisque nous n'avons pas beaucoup de java de l'expertise à l'interne, il serait mal vu par la direction. Mais, j'ai été en mesure de trouver un moyen de le faire à partir de la procédure stockée. J'ai dû ouvrir le fichier en octets à écrire en mode 'WB'. Ensuite, pour chaque enregistrement, je suis en train d'écrire dans le fichier, je le convertir le type de données RAW avec UTL_RAW.CAST_TO_RAW. Ensuite, utilisez UTL_FILE.PUT_RAW à écrire dans le fichier, suivi par tout nécessaire FFLUSH appels pour vider les tampons. Le système de réception a été en mesure de lire les fichiers; c'est très bien.
OriginalL'auteur Dustin