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