Bonjour,

J'ai un PL/SQL qui doit écrire un fichier sous Unix or quand on le lance on obtient le message d'erreur suivant :
ancien 91 : NomRepertoire := '&&1';
nouveau 91 : NomRepertoire := '/rtpg01/aneto/ceur00/batch/output';
ancien 95 : NomFichier := '&&2';
nouveau 95 : NomFichier := 'REMUNPS_RECUES_27012009_27012009.dat';
ancien 113 : DateTemp:= '&&3';
nouveau 113 : DateTemp:= '27012009';
ancien 115 : DateTemp:= '&&4';
nouveau 115 : DateTemp:= '27012009';
declare
*
ERREUR à la ligne 1 :
ORA-20100: erreur dans la reprise des données rémun. PS
ORA-06512: à ligne 147
ORA-20000: erreur dans l'ouverture du fichier
/rtpg01/aneto/ceur00/batch/output/REMUNPS_RECUES_27012009_27012009.dat
ORA-29280: chemin de répertoire non valide
On a créé sous Oracle la directory et les grant :
DROP DIRECTORY OUT_DIR;
CREATE OR REPLACE DIRECTORY
OUT_DIR AS '/rtpg01/aneto/tst00/batch/output';
GRANT READ, WRITE ON DIRECTORY SYS.OUT_DIR TO TST00_USER;
GRANT READ, WRITE ON DIRECTORY SYS.OUT_DIR TO PUBLIC;
Le répertoire a été créé sous Unix avec les droits en 777.

Quelqu'un a-t-il une idée car je sèche ?


Mon PL/SQL si ça peut aider à l'analyse :
-- Paramétrage de la session
WHENEVER SQLERROR EXIT 9;
WHENEVER OSERROR EXIT 10;
SET SERVEROUTPUT ON;
SET TIMING OFF;

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

declare

-- Déclaration type de l'entête
TYPE rec_entete IS RECORD (
ent_typenr char(1),
ent_idftrt number(9),
ent_typtrt char(1),
ent_fin varchar2(84)
);

-- Déclaration type du détail
TYPE rec_detail IS RECORD (
det_typenr char(1),
det_codnme char(4),
det_codsnm char(2),
det_numpsa char(9),
det_amcdet char(10),
det_numoct char(14),
det_typcpt char(1),
det_datrcp char(8),
det_datpai char(8),
det_grpamc char(2),
det_numamc char(10),
det_numfac char(9),
det_datfac char(8),
det_dattrt char(8),
det_indele char(1)
);

-- Déclaration du curseur
cursor cur_xfnpayes (pDatedeb date,pDatefin date) is
SELECT '2',xfnpcodnme,xfnpcodsnm,xfnpnumpsa,decode(xfnpamcdet,null,' ',xfnpamcdet),
xfnpnumoct,'T',to_char(xfnpdatrcp,'YYYYMMDD'),' ',xfamgrpamc,xfnpnumamc,xfnpnumfac,
to_char(xfnpdatfac,'YYYYMMDD'),to_char(xfnpdattrt,'YYYYMMDD'),xfnpindele
from xfnpayes, xfamcomp
where xfnpauddcr between to_date(pDatedeb,'DD/MM/YYYY HH24:MI:SS')
and to_date(pDatefin,'DD/MM/YYYY HH24:MI:SS')
and xfnpnumamc=xfamnumamc and xfnpcodnme=xfamcodnme and xfnpcodsnm=xfamcodsnm;

-- Déclaration des variables
lig_entete rec_entete;
lig_detail rec_detail;
WS_LIGNE CHAR(95);
WS_FILEHANDLE UTL_FILE.FILE_TYPE;
NomRepertoire VARCHAR2(150);
NomFichier VARCHAR2(150);
DateDeb VARCHAR2(20);
DateFin VARCHAR2(20);
DateTemp VARCHAR2(08);

-- GESTION DES EXCEPTIONS
FILE_NOT_FOUND EXCEPTION;
UTL_FILE_DIR_NOT_SET EXCEPTION;
PRAGMA EXCEPTION_INIT(FILE_NOT_FOUND, -1309);
PRAGMA EXCEPTION_INIT(UTL_FILE_DIR_NOT_SET, -1308);

PROCEDURE ECRIRE_ENTETE(WS_FILE_HANDLE UTL_FILE.FILE_TYPE) IS
BEGIN
lig_entete.ent_typenr := '1';
lig_entete.ent_idftrt := 999999999;
lig_entete.ent_typtrt := 'P';
-- ECRITURE DE L'ENTETE
WS_LIGNE := lig_entete.ent_typenr||lig_entete.ent_idftrt||lig_entete.ent_typtrt;

-- ECRITURE DANS LE FICHIER
UTL_FILE.PUT_LINE( WS_FILE_HANDLE, WS_LIGNE );
UTL_FILE.FFLUSH(WS_FILE_HANDLE);
DBMS_OUTPUT.PUT_LINE(WS_LIGNE) ;
END;

PROCEDURE ECRIRE_LIGNE(WS_FILE_HANDLE UTL_FILE.FILE_TYPE) IS
BEGIN

-- ECRITURE DE L'ENREGISTREMENT
WS_LIGNE := lig_detail.det_typenr||lig_detail.det_codnme||
lig_detail.det_codsnm||lig_detail.det_numpsa||lig_detail.det_amcdet||
lig_detail.det_numoct||lig_detail.det_typcpt||lig_detail.det_datrcp||
lig_detail.det_datpai||lig_detail.det_grpamc||lig_detail.det_numamc||
lig_detail.det_numfac||lig_detail.det_datfac||lig_detail.det_dattrt||
lig_detail.det_indele;

-- ECRITURE DANS LE FICHIER
UTL_FILE.PUT_LINE( WS_FILE_HANDLE, WS_LIGNE );
UTL_FILE.FFLUSH(WS_FILE_HANDLE);
--DBMS_OUTPUT.PUT_LINE(WS_LIGNE) ;
END;

begin

-- Repertoire dans lequel est stocke le fichier
NomRepertoire := '&&1';


-- Nom du fichier
NomFichier := '&&2';


-- OUVERTURE DU FICHIER
--**********************
BEGIN
WS_FILEHANDLE := UTL_FILE.FOPEN (NomRepertoire, NomFichier,'w');

EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, 'erreur dans l''ouverture du fichier '||NomRepertoire||'\'||NomFichier , TRUE);
END;

-- Ecriture de l'entête du fichier listant les incoherences et dans le fichier de log
--************************************************************************************
ECRIRE_ENTETE(WS_FILEHANDLE);

-- ouverture du curseurr
DateTemp:= '&&3';
DateDeb := SUBSTR(DateTemp,1,2)||'/'||SUBSTR(DateTemp,3,2)||'/'||SUBSTR(DateTemp,5,4)||' 00:00:00';
DateTemp:= '&&4';
DateFin := SUBSTR(DateTemp,1,2)||'/'||SUBSTR(DateTemp,3,2)||'/'||SUBSTR(DateTemp,5,4)||' 23:59:59';
open cur_xfnpayes (DateDeb,DateFin);

-- Boucle de lecture
loop
-- Sortie de la boucle si plus d'enreg
exit when cur_xfnpayes%notfound;

fetch cur_xfnpayes into lig_detail.det_typenr,lig_detail.det_codnme,
lig_detail.det_codsnm,lig_detail.det_numpsa,lig_detail.det_amcdet,
lig_detail.det_numoct,lig_detail.det_typcpt,lig_detail.det_datrcp,
lig_detail.det_datpai,lig_detail.det_grpamc,lig_detail.det_numamc,
lig_detail.det_numfac,lig_detail.det_datfac,lig_detail.det_dattrt,
lig_detail.det_indele;

ECRIRE_LIGNE(WS_FILEHANDLE);

--dbms_output.put_line(lig_detail.det_typenr||lig_detail.det_codnme||
-- lig_detail.det_codsnm||lig_detail.det_numpsa||lig_detail.det_amcdet||
-- lig_detail.det_numoct||lig_detail.det_typcpt||lig_detail.det_datrcp||
-- lig_detail.det_datpai||lig_detail.det_grpamc||lig_detail.det_numamc||
-- lig_detail.det_numfac||lig_detail.det_datfac||lig_detail.det_dattrt||
-- lig_detail.det_indele);

end loop;

-- fermeture du curseur
close cur_xfnpayes;

EXCEPTION
WHEN others THEN
RAISE_APPLICATION_ERROR(-20100, 'erreur dans la reprise des données rémun. PS' , TRUE);

end;
/

EXIT;