Bonjour, j'utilise oracle 10 g expresse, installé sur un serveur Linux, à distance et j'ai crée un pakage PL/SQL (heu je suis loin d'être un spécialiste Oracle) pour lire des données dans des fichiers, situés dans un répertoir, sur le même serveur linux où est installé ma base Oracle.

J'ai créer un répertoir oracle 'FICHIERS_IN' et mis des droits en lecture et écriture dessus, pour tout le monde, avec les instructions suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
CREATE DIRECTORY FICHIERS_IN AS '/home/share/aida/www;
GRANT READ, WRITE ON DIRECTORY fichiers_in TO PUBLIC;
j'ai une fonction pricipale 'initialisation_codif' qui appelle 2 fonctions secondaires:
I) Une fonction qui ouvre et lit le contenu d'un fichier QH00.txt de paramètre qui contient:
1)une première ligne avec le nom d'un fichier de données qui s'appel QH00
2)Plusieurs lignes comportant chacune un chiffre (des paramètres qui me permettront de découper chacune des lignes de mon fichier de données, mais ce n'est pas le propos ici...)

II) une fonction qui se sert du précédent nom de fichier récuppéré par la fonction I) pour ouvrir un fichier de données et faire divers traitements dessus.

A noté que mes deux fichiers QH00.txt et QH00 sont dans le même répertoire :
'/home/share/aida/www


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
 
 
--FONCTION PRINCIPALE
PROCEDURE initialisation_codif
IS
nomFic VARCHAR2(200);
t_rang TYP_TAB_NUM;
t_val TYP_TAB_VAR;
BEGIN
--ouverture et lecture de QH00.txt
chargement_fichier_param('QH00.txt', nomFic,t_rang);
dbms_output.put_line('initialisation_codif:' || nomFic || ':');
 
--ouvertur et lecture de QH00
lit_fic (nomFic, t_rang, t_val );
 
END initialisation_codif; 
 
--FONCTION I
PROCEDURE chargement_fichier_param(nom_fic_param IN VARCHAR2, nom_fic  OUT NOCOPY VARCHAR2, t_rang OUT NOCOPY TYP_TAB_NUM) 
IS
v_ligne VARCHAR2(200);
p_fic utl_file.file_type;
n_count NUMBER :=1;
 
BEGIN
p_fic := utl_file.fopen(nom_rep_param, nom_fic_param, 'r');
utl_file.get_line(p_fic,v_ligne);
nom_fic := v_ligne;
dbms_output.put_line('Chargement_fichier_param :' || nom_fic);
LOOP
  BEGIN 
   utl_file.get_line(p_fic,v_ligne);
   dbms_output.put_line('Chargement_fichier_param :' || v_ligne);
   IF (v_ligne <> NULL) THEN
     t_rang(n_count):= v_ligne;
   END IF;
   n_count := n_count + 1;
 
   EXCEPTION
   WHEN NO_DATA_FOUND THEN
      utl_file.fclose(p_fic);
   EXIT;
  END; 
END LOOP;
 
END chargement_fichier_param;
 
 
--FONCTION II
PROCEDURE lit_fic ( nom_fic IN VARCHAR2, t_rang IN  TYP_TAB_NUM, t_val  OUT  TYP_TAB_VAR)
IS         
v_ligne VARCHAR2(200);
p_fic utl_file.file_type;
n_count NUMBER;
BEGIN
--à l'affichage on a bien nom_fic qui est égale à QH00
dbms_output.put_line('lit_fic: '|| nom_fic);
--ouverture du fchier, c'est à ce moment qu'est générée l'erreur :ORA-29283: opération non valide sur le fichier
p_fic := utl_file.fopen(nom_rep_in, nom_fic, 'r');
LOOP
  BEGIN 
  utl_file.get_line(p_fic,v_ligne);
  dbms_output.put_line(v_ligne);
  t_val(1):= SUBSTR (v_ligne,1 ,t_rang(1));
  dbms_output.put_line(t_val(1)); 
  n_count :=1;
  FOR  i in 2..t_rang.COUNT LOOP
      n_count := n_count + t_rang(i-1);
      t_val(i):= SUBSTR (v_ligne,n_count,t_rang(i));
      dbms_output.put_line(t_val(i)); 
  END LOOP ;
 
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
     utl_file.fclose(p_fic);
     EXIT;
  END; 
END LOOP;
END lit_fic;
L'ouverture et la lecture du premier fichier 'QH00.txt' se passe sans problème et on récupère bien le nom du deuxième fichier nom_fic =QH00. Lorsque l'on fait afficher le nom du fichier nom_fic, entre l'appel de la première et de la deuxième fonction, on a bien QH00.

pourtant lors de l'ouverture du fichier QH00 dans la deuxième fonction, oracle nous renvois l'erreur

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 
ORA-29283: opération non valide sur le fichier
ORA-06512: à "SYS.UTL_FILE", ligne 475
ORA-29283: opération non valide sur le fichier
ORA-06512: à "AIDA_REPRISE.LOAD_FILE", ligne 17
ORA-06512: à "AIDA_REPRISE.LOAD_FILE", ligne 111
ORA-06512: à ligne 2
En revanche, si, au lieu de passer le paramètre nom_fic, à la fonction 'lit_fic',( paramètre récupéré à la fonction chargement_fichier_param) , on lui passe directement le paramètre 'QH00', on n'a pas d'erreur à l'ouverture du fichier QH00...
Ce qui me fait dire qu'il ne s'agit sans doute pas d'un problème de droit...
Je ne sais pas quoi faire et je tourne en rond depuis 2 jour.
Si quelqu'un a une idée, je suis preneuse....
Merci de votre aide!