-- 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;
Partager