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

La procédure UTL_FILE.FOPEN() n'accepte pas le chemin du répertoire ?

Depuis Oracle 9i, il existe deux façons de déclarer un répertoire à utiliser avec UTL_FILE.

L'ancienne méthode consiste à définir le paramètre INIT.ORA UTL_FILE_DIR. Nous devons redémarrer la base de données pour qu'un changement prenne effet. La valeur peut être comme n'importe quelle autre variable PATH; il accepte les caractères génériques. Utiliser cette approche signifie passer le chemin du répertoire...

UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');

L'approche alternative consiste à déclarer un objet répertoire.

create or replace directory temp_dir as 'C:\temp'
/

grant read, write on directory temp_dir to vineet
/

Les objets de répertoire nécessitent le chemin d'accès exact au fichier et n'acceptent pas les caractères génériques. Dans cette approche, nous passons le nom de l'objet répertoire...

UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');

UTL_FILE_DIR est obsolète car il est intrinsèquement non sécurisé - tous les utilisateurs ont accès à tous les répertoires du système d'exploitation spécifiés dans le chemin, tandis que les privilèges de lecture et d'écriture peuvent être accordés discrètement à des utilisateurs individuels. De plus, avec les objets Directory, nous pouvons ajouter, supprimer ou modifier des répertoires sans faire rebondir la base de données.

Dans les deux cas, l'oracle L'utilisateur du système d'exploitation doit disposer de privilèges de lecture et/ou d'écriture sur le répertoire du système d'exploitation . Si ce n'est pas évident, cela signifie le répertoire doit être visible depuis le serveur de base de données . Nous ne pouvons donc pas utiliser l'une ou l'autre approche pour exposer un répertoire sur notre PC local à un processus s'exécutant sur un serveur de base de données distant. Les fichiers doivent être téléchargés sur le serveur de base de données ou sur un lecteur réseau partagé.

Si l'oracle L'utilisateur du système d'exploitation ne dispose pas des privilèges appropriés sur le répertoire du système d'exploitation, ou si le chemin spécifié dans la base de données ne correspond pas à un chemin réel, le programme déclenchera cette exception :

ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7

Le texte OERR pour cette erreur est assez clair :

29283 -  "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.