UTL DE FICHIER.La procédure FOPEN() n'accepte pas le chemin pour le répertoire?

J'essaie d'écrire dans un fichier stocké dans c: drive nommé vin1.txt et comment cette erreur .S'il vous plaît suggérer!

> ERROR at line 1: ORA-29280: invalid
> directory path ORA-06512: at
> "SYS.UTL_FILE", line 18 ORA-06512: at
> "SYS.UTL_FILE", line 424 ORA-06512: at
> "SCOTT.SAL_STATUS", line 12 ORA-06512:
> at line 1

Voici le code

  create or replace procedure sal_status
   (
    p_file_dir IN varchar2,
    p_filename IN varchar2)
     IS  
    v_filehandle utl_file.file_type;
    cursor emp Is
        select * from employees
        order by department_id;
    v_dep_no departments.department_id%TYPE;
     begin
         v_filehandle :=utl_file.fopen(p_file_dir,p_filename,'w');--Opening a file
         utl_file.putf(v_filehandle,'SALARY REPORT :GENERATED ON %sn',SYSDATE);
         utl_file.new_line(v_filehandle);
         for v_emp_rec IN emp LOOP
            v_dep_no :=v_emp_rec.department_id;
            utl_file.putf(v_filehandle,'employee %s earns:sn',v_emp_rec.last_name,v_emp_rec.salary);                    
         end loop;
        utl_file.put_line(v_filehandle,'***END OF REPORT***');
        UTL_FILE.fclose(v_filehandle);
     end sal_status;

execute sal_status('C:','vin1.txt');--Executing
21
demandé sur APC 2010-05-01 22:37:22

6 réponses

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 L'initialisation.Ora paramètre UTL_FILE_DIR. Nous devons redémarrer la base de données pour qu'un changement prenne effet. La valeur peut aimer n'importe quelle autre variable de chemin; elle 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'autre approche consiste à déclarer un objet directory.

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 de fichier exact, et n'acceptez pas les caractères génériques. Dans cette approche, nous passons le nom de l'objet de répertoire...

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

Le 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, alors que les privilèges de lecture et d'écriture peuvent être accordés discrètement aux utilisateurs individuels. En outre, 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'utilisateur du système d'exploitation oracle doit avoir lu et / ou écrit privilèges sur le répertoire du système d'exploitation. Dans le cas où ce n'est pas évident, cela signifie que 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'utilisateur du système d'exploitation oracle 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 correspond à un chemin réel, le programme lancera 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.
34
répondu APC 2017-04-26 12:33:23

N'oubliez pas non plus que le chemin d'accès du fichier se trouve sur la machine oracle server et non sur une machine de développement locale qui pourrait appeler votre procédure stockée. C'est probablement très évident, mais quelque chose dont il faut se souvenir.

5
répondu Josh P 2015-01-30 23:26:16

Vous devez enregistrer le répertoire avec Oracle. fopen prend le nom d'un objet directory, pas le chemin. Par exemple:

(vous devrez peut-être vous connecter en tant que SYS pour les exécuter)

CREATE DIRECTORY MY_DIR AS 'C:\';

GRANT READ ON DIRECTORY MY_DIR TO SCOTT;

Ensuite, vous pouvez vous référer à l'appel à fopen:

execute sal_status('MY_DIR','vin1.txt');
4
répondu Jeffrey Kemp 2010-05-02 07:55:13

Pour utl_file.ouvert (emplacement, nom de fichier, mode), nous devons donner le nom du répertoire pour l'emplacement mais pas le chemin. Par exemple: DATA_FILE_DIR, c'est le nom du répertoire et vérifie le chemin du répertoire pour ce nom de répertoire particulier.

1
répondu sujini 2015-05-14 11:04:47

Vous devez demander à votre DBA de modifier l'initialisation.ouun fichier, en ajoutant le répertoire auquel vous souhaitez accéder au paramètre 'utl_file_dir'. Votre instance de base de données devra ensuite être arrêtée et redémarrée car init.ora n'est lu que lorsque la base de données est affichée.

Vous pouvez afficher (mais pas modifier) ce paramètre en exécutant la requête suivante:

SELECT *
  FROM V$PARAMETER
  WHERE NAME = 'utl_file_dir'

Partager et profiter.

0
répondu Bob Jarvis 2010-05-01 23:06:39

Le nom du répertoire semble sensible à la casse. J'ai fait face au même problème mais quand j'ai fourni le nom du répertoire en majuscules, cela a fonctionné.

0
répondu Shafqat Ali 2016-09-02 21:14:04