web-dev-qa-db-fra.com

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

Voici le code que j'utilise pour extraire les données d'une table dans 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 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 s'il vous plaît faites le moi savoir si vous avez besoin de plus de données de moi pour résoudre cette question.

6
Vivek

Ainsi, @Vivek a trouvé la solution au problème par le biais d'un dialogue dans les commentaires plutôt que par le biais d'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 d'une 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 réponse appropriée à cette question, mais simplement une redirection vers un autre endroit. 

5
APC

Sous Windows, vérifiez également si le fichier n'est pas chiffré à l'aide de EFS. J'ai eu le même problème jusqu'à ce que je déchiffre le fichier manuellement.

0
Khamyl

Je faisais face à ce problème depuis deux jours et j’ai constaté que le répertoire que vous créez dans Oracle doit également être créé en premier sur votre disque physique. Je n'ai pas trouvé ce point mentionné nulle part où j'ai essayé de rechercher la solution à ce problème.

c'est à dire.

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 au niveau du système de fichiers sont disponibles pour le processus Oracle.

Ma compréhension de UTL_FILE à partir de mes expériences est donnée ci-dessous pour ce type d'opération.

UTL_FILE est un objet sous l'utilisateur SYS. GRANT EXECUTE SUR SYS.UTL_FILE TO PUBLIQUE; doit être donné en étant 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 en tant que affiché: - CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DBWORKS'; Mais CREATE La permission ANNUAIRE devrait être en place. Cela peut être accordé en tant que montré: - GRANT CREATE ALL DIRECTORY TO utilisateur; en étant connecté en tant que SYS utilisateur. Toutefois, si cela doit être utilisé par un autre utilisateur, les subventions ont besoin de à donner à cet utilisateur sinon il va jeter une erreur. GRANT READ, WRITE, EXECUTE ON DB_DIR TO utilisateur; en étant connecté en tant qu'utilisateur qui créé le répertoire. Ensuite, compilez votre paquet. Avant d'exécuter la procédure, assurez-vous que le répertoire existe physiquement sur votre fichier Disque. Sinon, l'erreur «Opération de fichier non valide» sera générée. (V . IMPORTANT) Assurez-vous que les autorisations de lecture/écriture au niveau du système de fichiers sont bien définies dans place pour le processus Oracle. Ceci est distinct du niveau de la base de données autorisations accordées. (V. IMPORTANT) Exécutez la procédure. Le fichier devrait avoir rempli avec le jeu de résultats de votre requête.

0
Ayush Pratap Singh