Bonjour,

C'est mon premier post sur les forums de developpez.com, que je fréquente depuis quelques années. Aujourd'hui j'ai un problème sur une procédure PL/SQL sur base oracle, j'éspère que quelqu'un pourra m'aider !

Il s'agit de lire deux valeurs dans un fichier csv et de les stocker dans une table. J'utilise pour cela deux variables (Variable_1 et Variable_2).

Voilà le message d'erreur qui apparait lors de l'execution:
ORA-06502: erreur numérique ou erreur sur une valeur: erreur de conversion des caractères en chiffres.

Et voilà 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
 
 
CREATE OR REPLACE PROCEDURE MA_PROCEDURE IS
 
/* Déclaration des variables */
fichier utl_file.file_type; 
buffer VARCHAR2 (1024);
pos1 INT := 1; 
pos2 INT := 1; 
Variable_1 TABLE_1.COLONNE_1%TYPE;
VARIABLE_2 TABLE_1.COLONNE_2%TYPE;
ESL TABLE_1.COLONNE_2%TYPE;
ESF TABLE_1.COLONNE_2%TYPE;
EST TABLE_1.COLONNE_2%TYPE;
premiereligne INT :=1;
 
/* Début de procédure */
BEGIN
 
/* Ouverture du fichier source */
   fichier := utl_file.fopen ('chemin','fichier.csv','r');
 
LOOP
BEGIN
 
/* Lecture */
   IF premiereligne = 0 THEN --on ne veut pas lire la premiere ligne du fichier qui contient les noms de colonnes
   	  pos1 := 1;
   	  pos2 := 1;
   	  utl_file.get_line (FILE => fichier ,buffer => buffer);
 
   	  pos1 := INSTR (buffer, ';', 1, 3)+1;
   	  pos2 := INSTR (buffer, ';', 1, 4);
   	  Variable_1 := SUBSTR(buffer, pos1, pos2-pos1);
 
 
   	  pos1 := INSTR (buffer, ';', 1, 6)+1;
   	  pos2 := INSTR (buffer, ';', 1, 7);
   	  VARIABLE_2 := SUBSTR(buffer, pos1, pos2-pos1);   
 
/* Update */
   	  IF Variable_1 <> "ESL" AND Variable_1 <> "ESF" THEN
   	  	 UPDATE TABLE_1 SET COLONNE_2 = VARIABLE_2
   	  	 WHERE COLONNE_1 = Variable_1;
      ELSE
   	  	 IF Variable_1 = "ESL" THEN ESL := VARIABLE_2;
	  	 END IF;
	  	 IF Variable_1 = "ESF" THEN ESF :=VARIABLE_2;
	  	 END IF;
   	  END IF;
   ELSE
   premiereligne :=0;
   END IF;
END;
END LOOP;
 
EST := ESL + ESF;
UPDATE TABLE_1 SET COLONNE_2 = EST
WHERE COLONNE_1 = "EST";
 
utl_file.fclose(fichier);
COMMIT;
 
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END MA_PROCEDURE;
/
Lors de débuggage, la procédure lit la première ligne du fichier csv, et donne une valeur correcte à la Variable_1, puis à la Variable_2. Ce n'est qu'ensuite qu'apparait le message d'erreur.

TABLE_1.COLONNE_1 est du type VARCHAR2(15). Les valeurs lues dans le .csv ne dépassent pas les 3 caractères.
TABLE_1.COLONNE_2 est du type NUMBER(16,2). Les valeurs lues dans le fichier csv ne dépassent pas une longueur de 16 caractères, et sont des numériques à deux chiffres apres la virgule.


Quelqu'un sautait-il d'ou cette erreur peut venir? Merci d'avance !