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 !