ORA-29283 :opération de fichier non valide ORA-06512 :à « SYS.UTL_FILE », ligne 536

StackOverflow https://stackoverflow.com/questions/6014884

Question

Vous trouverez ci-dessous le code que j'utilise pour extraire les données d'une table vers un fichier plat.

BEGIN
    DECLARE
        file_name VARCHAR2(50);
        file_handle utl_file.file_type;
BEGIN
    file_name := 'table.txt';
    file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
    SELECT            column 1
                ||'~'||column 2
                ||'~'||column 3 out_line
    FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;

Ce code fonctionne bien dans notre base de données de développement mais il renvoie l'erreur ci-dessous si j'exécute dans une nouvelle base de données.

Error starting at line 1 in command:
    BEGIN
    DECLARE
        file_name VARCHAR2(50);
        file_handle utl_file.file_type;
BEGIN
    file_name := 'table.txt';
    file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
    SELECT            column 1
                ||'~'||column 2
                ||'~'||column 3 out_line
    FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;

Error report:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
29283. 00000 -  "invalid file operation"
*Cause:    An attempt was made to read from a file or directory that does
           not exist, or file or directory access was denied by the
           operating system.
*Action:   Verify file and directory access privileges on the file system,
           and if reading, verify that the file exists.

Oracle directory 'SEND' points to some UNIX directory which has rights as 
       'rwxrwsr-x' (Octal 2775)
Oracle Version:11g

S'il vous plaît, aidez-moi à résoudre ce problème.

Les gars, faites-moi savoir si vous avez besoin de plus de données de ma part pour résoudre cette question.

Était-ce utile?

La solution

Ainsi, @Vivek a trouvé la solution au problème via un dialogue dans les commentaires plutôt que via une réponse réelle.Qui a dit que SO était un site de questions-réponses et non un forum ?Euh, moi, entre autres.

Quoi qu'il en soit, en l'absence de réponse acceptée à cette question, je propose un lien vers une de mes réponses sur le sujet de UTL_FILE.FOPEN(). Trouvez-le ici.

P.S.Je marque cette réponse Community Wiki, car ce n'est pas une bonne réponse à cette question, juste une redirection vers un autre endroit.

Autres conseils

sur Windows Vérifiez également si le fichier n'est pas crypté à l'aide d'EFS.J'ai eu le même problème jusqu'à ce que j'ai déchiffré le fichier manualy.

J'avais fait face à ce problème pendant deux jours et j'ai constaté que le répertoire que vous créez dans Oracle doit également créer d'abord sur votre disque physique.

Je n'ai pas trouvé ce point mentionné nulle part où j'ai essayé de regarder la solution à cela.

Exemple

Si vous avez créé un répertoire, disons, "DB_DIR".

CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DB_WORKS';

Ensuite, vous devez vous assurer que DB_WORKS existe dans votre lecteur E:\ et que les autorisations de lecture / écriture de niveau système sont également disponibles sur le processus Oracle.

Ma compréhension de l'utl_file de mes expériences est donnée ci-dessous pour ce type de fonctionnement.

utl_file est un objet sous l'utilisateur SYS. Grant exécuter sur SYS.TL_File à PUBLIQUE; doit être donné lorsqu'il est connecté en tant que SYS. Sinon, ça va Donner une erreur de déclaration dans la procédure. Tout le monde peut créer un répertoire comme montré: - créer ou remplacer le répertoire db_dir sous "E: \ dbworks"; Mais créer La permission d'annuaire devrait être en place. Cela peut être accordé comme montré: - Subvention crée tout annuaire à l'utilisateur; Bien connecté en tant que SYS utilisateur. Cependant, si cela doit être utilisé par un autre utilisateur, les subventions ont besoin à donner à cet utilisateur, sinon il lancera une erreur. Grant lire, Écrire, exécuter sur db_dir à l'utilisateur; tandis que Loggedin en tant qu'utilisateur qui créé le répertoire. Ensuite, compilez votre colis. Avant d'exécuter la procédure, assurez-vous que le répertoire existe physiquement sur votre Disque. Sinon, il lancera une erreur «Opération de fichier invalide». (V. IMPORTANT) Assurez-vous que les autorisations de lecture / écriture de niveau de fichier de fichiers sont dans place pour le processus Oracle. Ceci est séparé du niveau de DB autorisations octroyées. (v. Important) Exécution de la procédure. Le fichier devrait obtenir peuplé avec l'ensemble de résultats de votre requête.

Supposez que le fichier est déjà créé dans le répertoire prédéfini avec nom "table.txt"

  • 1) changer la propriété du fichier:

    sudo chown username:username table.txt
    

  • 2) Modifiez le mode du fichier

    sudo chmod 777 table.txt
    

    Maintenant, essayez-le de fonctionner!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top