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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ...