UTL_FILE : problème d'écriture du fichier
Bonjour,
J'ai un script shell sous unix qui doit extraire des données d'une table Oracle et les écrires dans un fichier sous unix.
J'utilise donc pour cela le sqlplus, pl/sql et le package UTL_FILE.
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
[...]
ag_num=027
var_rep="/tmp"
var_fic="win_ana_ag"
sqlplus -s $USER_ORACLE_APPLI/$PWD_ORACLE_APPLI@$BASE_ORACLE_APPLI <<EOF
WHENEVER OSERROR EXIT 100
WHENEVER SQLERROR EXIT 101
SET SERVEROUTPUT ON SIZE 1000000
PROMPT --------Appel fonction pl/sql---------------
DECLARE
c_repertoire VARCHAR2(30);
c_fichier VARCHAR2(30);
v_enr VARCHAR2(500);
v_fichier UTL_FILE.FILE_TYPE;
o_errn NUMBER(12);
o_errm VARCHAR2(255);
i number(10);
/* declaration du curseur */
CURSOR C_PART (p_ag_num IN NUMBER) IS
select distinct cpt_num as Compte,
cpt_exp_nom as Nom,
le_partenaire as IDF,
le_login_tvw as LoginTVW
from histo_liaison_edi@TO_CODP.WORLD
where AG_NUM_COMMERC = p_ag_num
/* exclure les agences Domino*/
and le_partenaire not like 'DA%FR%CK%'
and le_dat_integration is not null
;
/* declaration des variables*/
v_Compte VARCHAR2(9);
v_Nom VARCHAR2(30);
v_IDF VARCHAR2(15);
v_LoginTVW VARCHAR2(15);
/* debut traitement*/
BEGIN
c_repertoire := '$var_rep';
c_fichier := '$var_fic';
v_fichier := utl_file.fopen(c_repertoire, c_fichier, 'w');
If not UTL_FILE.IS_OPEN( v_fichier ) Then
RAISE_APPLICATION_ERROR( -20100, 'Erreur ouverture du fichier ' ) ;
End if ;
i := 0;
Open C_PART( '$ag_num' ) ; /* ouverture du curseur avec passage du code agence en parametre */
Loop
i := i+1;
Fetch C_PART Into v_Compte, v_Nom, v_IDF, v_LoginTVW ;
Exit When C_PART%NOTFOUND ; /*sortie lorsque le curseur ne ramene plus de ligne*/
v_enr := v_Compte || ';' || v_Nom || ';' || v_IDF || ';' || v_LoginTVW ;
dbms_output.put_line(i);
dbms_output.put_line(v_enr);
utl_file.put_line(v_fichier, v_enr);
End loop ;
Close C_PART ; /*fermeture du curseur*/
utl_file.fclose(v_fichier);
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
When UTL_FILE.INVALID_PATH Then
o_errm := c_repertoire || c_fichier || ' : ' || 'File location is invalid.';
RAISE_APPLICATION_ERROR( -20070, o_errm ) ;
When UTL_FILE.INVALID_MODE Then
o_errm := c_repertoire || c_fichier || ' : ' || 'The open_mode parameter in FOPEN is invalid.';
RAISE_APPLICATION_ERROR( -20070, o_errm ) ;
When UTL_FILE.INVALID_FILEHANDLE Then
o_errm := c_repertoire || c_fichier || ' : ' || 'File handle is invalid.';
RAISE_APPLICATION_ERROR( -20070, o_errm ) ;
When UTL_FILE.INVALID_OPERATION Then
o_errm := c_repertoire || c_fichier || ' : ' || 'File could not be opened or operated on as requested.';
RAISE_APPLICATION_ERROR( -20070, o_errm ) ;
When UTL_FILE.READ_ERROR Then
o_errm := c_repertoire || c_fichier || ' : ' || 'Operating system error occurred during the read operation.';
RAISE_APPLICATION_ERROR( -20070, o_errm ) ;
When UTL_FILE.WRITE_ERROR Then
o_errm := c_repertoire || c_fichier || ' : ' || 'Operating system error occurred during the write operation.';
RAISE_APPLICATION_ERROR( -20070, o_errm ) ;
When UTL_FILE.INTERNAL_ERROR then
o_errm := c_repertoire || c_fichier || ' : ' || 'Unspecified PL/SQL error';
RAISE_APPLICATION_ERROR( -20070, o_errm ) ;
WHEN OTHERS THEN
o_errn := SQLCODE;
o_errm := SQLERRM;
DBMS_OUTPUT.PUT_LINE('ERREUR pendant le traitement, No :' || o_errn);
DBMS_OUTPUT.PUT_LINE('Description : '|| o_errm);
utl_file.fclose(v_fichier);
RAISE;
END ;
/
EXIT
EOF |
L'extraction des données se passe bien et le traitement se déroule sans aucune erreur. Le problème c'est que le fichier n'est pas créé.
L'option utl_file_dir d'oracle est égale à /tmp .
Quelqu'un a t'il une idée car là je sèche complètement depuis un bon moment ...