Oracle
 sql >> Base de données >  >> RDS >> Oracle

UTL_FILE.WRITE_ERROR lors de l'appel de utl_file.put dans une boucle

  1. Publiez la version d'Oracle que vous utilisez ! Ou nous pouvons simplement deviner...

  2. 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.

  3. tbone a tout à fait raison, la ligne TO_CHAR(10) est fausse ! Essayez simplement SELECT TO_CHAR(10) FROM DUAL; vous obtiendrez 10 que vous comparez ensuite à un seul caractère. Un seul caractère ne sera jamais '10' puisque 10 a deux caractères !

  4. 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 !