Bonjour tout le monde,
je développe en ce moment un script d'import de tables mi-shell (), mi-PL/SQL.
L'import se fait via des fichiers csv qui sont nommé comme la table a laquelle ils font référence (ex ma_table.csv). On m'a demandé de mettre en place un filtrage des tables pour l'import (par exemple sur 5 csv présent seulement 3 peuvent être importés). pour faire le filtrage j'ai une table en base de données qui contient la liste des tables autorisées pour la mise à jour.
c'est sur la partie filtrage que j'ai mon problème. sont fonctionnement est assez simple. en shell je crée un fichier dans lequel je stocke la liste des fichiers csv présent. j'appel par la suite une procédure PL/SQL qui lit le fichier en question ligne par ligne et regarde si la valeur récupérée est présente dans la table. si oui elle est stocké dans un 2eme fichier.
ma procédure est la suivante :
lorsque j'execute mon shell j'ai toujours l'erreur suivante :
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 PROCEDURE CONTROL_TABLE (in_rep VARCHAR2) IS liste_fichier UTL_FILE.FILE_TYPE; liste_fichier_trie UTL_FILE.FILE_TYPE; repertoire VARCHAR2(200); fichier VARCHAR2(200); fichier_tri VARCHAR2(200); ligne VARCHAR2(1000); is_ok NUMBER; BEGIN repertoire:='TEST_ALIM'; fichier:=in_rep || 'chargtabletmp.lst'; fichier_tri:='chargtabletri.lst'; --ouverture du fichier de liste des tables DBMS_OUTPUT.PUT_LINE('ouverture des fichiers'); liste_fichier:=UTL_FILE.FOPEN(repertoire, fichier, 'r'); --ouverture du fichier de liste des tables filtrees liste_fichier_trie:=UTL_FILE.FOPEN(repertoire, fichier_tri, 'w'); BEGIN LOOP --lecture du fichier en entrée -- UTL_FILE.GET_LINE(liste_fichier, ligne); --on recupere seulement le nom de la table is_ok:=test_table(ligne); -- fonction toute bete qui fait un select dans la table et retourne 1 si c'est présent IF is_ok = 1 THEN --écriture du fichier en sortie -- UTL_FILE.PUT_LINE(liste_fichier_trie, ligne); END IF; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN -- Fermeture des fichiers -- UTL_FILE.FCLOSE(liste_fichier) ; UTL_FILE.FCLOSE(liste_fichier_trie) ; END; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('erreur ' || sqlerrm); END CONTROL_TABLE;
ERREUR à la ligne 1 :
ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: tampon de chaîne de caractères trop petit
ORA-06512: à "ADM_ALIMAUTO", ligne 5
ORA-06512: à ligne 1
ADM_ALIMAUTO etant le package auquel appartient la procédure
après différentes recherche j'ai essayer de jouer tu la taille de mon varchar2 "ligne" en le mettant a 32000, j'ai essayé également de limiter la taille dans le UTL_FILE.FOPEN(repertoire, fichier, 'r', 1000); mais rien n'y fait.
chose assez étrange ma procédure fonctionne correctement quand je l'exécute via sql developer (enfin elle plante une fois et après fonctionne tout le temps)
si quelqu'un a une piste je suis preneur car la j'avoue que je ne vois plus trop quoi faire.
Merci d'avance
Leftyy
EDIT1 :
j'ai testé sous sql developer et sqlplus :
je me connecte sur sqlplus, j'execute une premiere fois la procédure --> erreur. sans me deconnecter j'execute une deuxieme fois la procédure et la ca fonctionne. je me deconnecte et je me reconnecte et ca recommence la première fois que je l'execute ca plante
Partager