Bonjour,
Je fais de la migration de données et je fais face à un cas particulier. Un champs d'une table a été utilisé pour stocker les informations de plusieurs enregistrements. A moi de récupérer la valeur de ce champs et de créer un nouvel enregistrement pour chaque lignes dans ma table cible. J'ai réalisé une fonction qui réalise bien cette action.
Mais je suis incapable d'utiliser ma fonction dans un bloc PL-SQL si mon champs String est une variable.
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 /*------------------------------------------------------------------------------ FONCTION : Découpage d'une chaîne de caractère, via un caractère de séparation, dans une liste -------------------------------------------------------------------------------*/ -- -- Version 001.001 -- CREATE OR REPLACE FUNCTION SPLIT_STRING_INTO_LIST(separator IN VARCHAR2, string_param IN VARCHAR2) RETURN TABLE_OF_VARCHAR2 AS string_to_split VARCHAR2(32767) := string_param || separator; separator_index NUMBER; l_index NUMBER := 1; list_splitted TABLE_OF_VARCHAR2 := TABLE_OF_VARCHAR2(); BEGIN LOOP separator_index := INSTR(string_to_split, separator, l_index); EXIT WHEN separator_index = 0; list_splitted.EXTEND; list_splitted(list_splitted.COUNT) := TRIM(SUBSTR(string_to_split,l_index,separator_index - l_index)); l_index := separator_index + 1; END LOOP; RETURN list_splitted; END SPLIT_STRING_INTO_LIST;
Le fonctionnement est le suivant:
1- Je boucle sur mon champs source à l'aide d'un cursor pour récupérer le champs à découper
2- Ma fonction renvoyant potentiellement plusieurs ligne, je parcours le résultat de ma fonction split dans un second cursor paramétré pour insérer une a une les ligne retournées dans ma table cible.
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 DECLARE descr VARCHAR2(4000); res VARCHAR2(4000); desc_string VARCHAR2(4000); CURSOR a1 IS SELECT description des FROM tableSource; CURSOR b1(desc_string VARCHAR2) IS SELECT * INTO res FROM TABLE(split_string_into_list(chr(10),desc_string)); BEGIN FOR a IN a1 LOOP descr:=c.des; FOR b IN b1(descr) LOOP INSERT INTO Z_NAS_INPUT_SOURCE_STRING VALUES (res); END LOOP; END LOOP; END; /
Si j'enlève le paramétrage de mon cursor C2 pour insérer en dur un string dans le code (type 'aaa,bbb,ccc') cela fonctionne. Mais avec le paramètre, je récupère une erreur ORA-22905: impossible d'accéder aux lignes d'un élément qui n'appartient pas à une table imbriquée.
J'ai l'impression que cela vient de l'utilisation de "Select * FROM TABLE(); ". Malheureusement, toutes les solutions que je trouve sont faites avec des versions d'oracles supérieures à la 9i.
Pouvez vous m'aider?
Cordialement,
Moriceot
Partager