User Tools

Site Tools


mgenay:technique:kb_oracle_file_access

J'ai tenté de débugger une procédure stockée Oracle. C'est procédure stockées plantait sur l'accès à un fichier via le script suivant :

DECLARE
  vc_SeqInvoiceFile     VARCHAR2 (4);
  vc_DirectoryAlias	VARCHAR2 (50):= '/var/lad';
  vc_Filename		VARCHAR2 (25);
  vc_ExtensionFile      VARCHAR2 (4):='.txt';
  vf_File          	UTL_FILE.FILE_TYPE;
 
BEGIN
    SELECT TO_CHAR(COMPTEURSLS.nextval) 
    INTO   vc_SeqInvoiceFile
    from   DUAl;
 
    vc_Filename :=    'PSLS_DISP01_'||vc_SeqInvoiceFile||'_LADC'||vc_ExtensionFile;
    dbms_output.put_line ( 'essai' );
    vf_File := UTL_FILE.FOPEN (vc_DirectoryAlias, vc_filename, 'W');
    dbms_output.put_line (vc_Filename );
 
EXCEPTION
  WHEN utl_file.invalid_path THEN
    RAISE_APPLICATION_ERROR(-20001, 'utl_file.invalid_path');
  WHEN utl_file.invalid_mode THEN
    RAISE_APPLICATION_ERROR(-20001, 'utl_file.invalid_mode');
  WHEN utl_file.invalid_filehandle THEN
    RAISE_APPLICATION_ERROR(-20001, 'utl_file.invalid_filehandle');
  WHEN utl_file.invalid_operation THEN
    RAISE_APPLICATION_ERROR(-20001, 'utl_file.invalid_operation');
  WHEN utl_file.read_error THEN
    RAISE_APPLICATION_ERROR(-20001, 'utl_file.read_error');
  WHEN utl_file.write_error THEN
    RAISE_APPLICATION_ERROR(-20001, 'utl_file.write_error');
  WHEN utl_file.internal_error THEN
    RAISE_APPLICATION_ERROR(-20001, 'utl_file.internal_error');
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20001, 'utl_file.other_error');   
 
END;
/

Le résultat fut :

ERROR at line 1:
ORA-20001: utl_file.invalid_path
ORA-06512: at line 20

Le problème vient du fait que '/var/lad' n'a pas été déclaré dans Oracle.

S'il avait s'agit d'un serveur 9.2.x ou ultérieur, il aurait fallu, avec le compte SYS ou SYSTEM, lancer :

CREATE DIRECTORY var_lad_dir AS '/var/lad';
 
GRANT READ ON DIRECTORY var_lad_dir to synchro;
GRANT WRITE ON DIRECTORY var_lad_dir to synchro;

Dans le cas qui s'est présenté, il s'agissait d'un serveur 8.1.7.4. Il fallait donc modifier le fichier init.ora pour ajouter ou modifier une ligne UTL_FILE_DIR = /toto,/tutu/machin',/var/lad' Puis il a fallu 'redémarrer' le serveur !

mgenay/technique/kb_oracle_file_access.txt · Last modified: by 127.0.0.1