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.

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;
Mais je suis incapable d'utiliser ma fonction dans un bloc PL-SQL si mon champs String est une variable.
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