-
Publiez la version d'Oracle que vous utilisez ! Ou nous pouvons simplement deviner...
-
Votre
fflush
ne fonctionnera pas comme prévu - À partir de la documentation :FFLUSH écrit physiquement les données en attente dans le fichier identifié par le descripteur de fichier. Normalement, les données écrites dans un fichier sont mises en mémoire tampon. La procédure FFLUSH force l'écriture des données mises en mémoire tampon dans le fichier. Les données doivent se terminer par un caractère de retour à la ligne.
-
tbone a tout à fait raison, la ligne TO_CHAR(10) est fausse ! Essayez simplement
SELECT TO_CHAR(10) FROM DUAL;
vous obtiendrez10
que vous comparez ensuite à un seul caractère. Un seul caractère ne sera jamais '10' puisque 10 a deux caractères ! -
Votre problème est probablement un débordement de tampon avec des fichiers XML trop volumineux, mais gardez à l'esprit que d'autres problèmes sur le système cible peuvent également entraîner des erreurs d'écriture, qui doivent être gérées.
Solutions
-
Rapide et sale :Puisque vous ne semblez pas vous soucier des performances de toute façon, vous pouvez simplement fermer le fichier tous les X octets et le rouvrir avec A pour ajouter. Alors ajoutez simplement à la boucle :
IF MOD( l_offset, 32000 ) = 0 THEN UTL_FILE.FCLOSE( f_out ); UTL_FILE.FOPEN( out_fpath, out_fname, f_out, 'a', 32767 ); END IF;
-
Utilisez le bon outil pour le bon travail :
UTL_FILE
n'est pas adapté au traitement de données complexes. Le seul cas d'utilisation pour UTL_FILE sont de petites lignes de texte séparées par des retours à la ligne. Pour tout le reste, vous devez écrire des octets RAW ! (Ce qui vous permettra également de mieux contrôler l'ENCODAGE, qui n'est actuellement qu'un mini-vanilly-lucky-guess) -
Écrivez une procédure stockée Java avec NIO-Filechannels - rapide, sûr, agréable... Mais attention, votre programme pourrait s'exécuter 10 fois plus vite !