Bonjour,

Le fichier source comporte des données multivaluées (à charger dans des champs de type VARRAY), avec un nombre d’éléments variable d’une ligne à l’autre et qui ont la particularité d’être liées entre elles.
Par exemple : commande effectuée par un client, une date donnée, d’un certain nombre de produits.
Chaque produit a 2 « attributs » : couleur, et nombre d’articles commandés. Les codes produits, couleur et nombre d’articles sont insérés dans des Varray distincts.
Exemple de données à charger :
CLIENT|DATECMDE|PRODUIT|COULEUR|NBARTICLES
DUPOND|25/10/2016|A180831§C274182§U295008§E393455|1§§3§|12§2§35§
DURAND|11/07/2013|Z135451§P355697§B274182|§2§4|§5§300

Le problème se pose lorsque certains « attributs » ne sont pas renseignés. Il y a bien création d’un élément avec la valeur Null dans le Varray excepté si la valeur non renseignée est en dernière position. Dans ce cas, Oracle ne crée pas d’élément, et donc il n’y a pas le même nombre d’éléments dans chacun des Varray.
J'ai bidouillé le Control File dans tous les sens pour essayer de trouver la solution mais rien à faire... En d’autres termes, je souhaiterais que l’option « trailing nullcols » mise pour le chargement de la table s’applique à l’intérieur des Varray.

Jusqu’à présent, je me suis contentée de ce fonctionnement en partant du principe que s’il manquait un élément c’était toujours le dernier et sa valeur était Null.
Or, il s’avère que les données source comportent des erreurs « structurelles » et que je ne peux pas les repérer ainsi.
Il y a des pistes pour contourner le problème : charger chaque « attribut » dans un champ VARCHAR (…), puis recréer chaque élément en recherchant les caractères terminaux (ici §)… mais je préférerais ne pas modifier toutes mes tables et les traitements qui suivent...

Désolée pour tous les guillemets . Un grand merci pour votre attention , et pour une solution

Ci-dessous, des informations supplémentaires qui peuvent éclaircir (ou pas) ma demande.

Création des types varray :
Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
3
4
 
create or replace type varray_pdtcod is varray(100) of varchar2(7);
create or replace type varray_pdtclr is varray(100) of number(1);
create or replace type varray_pdtnbr is varray(100) of number(3);


Description de la table TEST :
Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
Nom                             NULL ?   Type
------------------------------- -------- ------------
CLIENT                          NOT NULL VARCHAR2(50)
DATECMDE                                 DATE
PRODUIT                                  VARRAY_PDTCOD
COULEUR                                  VARRAY_PDTCLR
NBARTICLES                               VARRAY_PDTNBR


Control File :
Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
replace
into table TEST
fields terminated by '|'
trailing nullcols
(Client, DateDeCmde date "DD/MM/YYYY",
Produit varray terminated by '|' (Produit terminated by '§'),
Couleur varray terminated by '|' (Couleur terminated by '§'),
NbArticles varray terminated by '|' (NbArticles terminated by '§'))


Voici le contenu de la table TEST après le chargement des 2 lignes données en exemple au début :
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
 
SQL> select client,datecmde,produit from TEST;
 
CLIENT     DATECMDE   PRODUIT
---------- ---------- ------------------------------------------------------------------
DUPOND     25/10/2016 VARRAY_PDTCOD('A180831', 'C274182', 'U295008', 'E393455')
DURAND     11/07/2013 VARRAY_PDTCOD('Z135451', 'P355697', 'B274182')
 
SQL> select client,datecmde,couleur from TEST;
 
CLIENT     DATECMDE   COULEUR
---------- ---------- ------------------------------------------------------------------
DUPOND     25/10/2016 VARRAY_PDTCLR(1, NULL, 3)
DURAND     11/07/2013 VARRAY_PDTCLR(NULL, 2, 4)
 
SQL> select client,datecmde,nbarticles from TEST;
 
CLIENT     DATECMDE   NBARTICLES
---------- ---------- ------------------------------------------------------------------
DUPOND     25/10/2016 VARRAY_PDTNBR(12, 2, 35)
DURAND     11/07/2013 VARRAY_PDTNBR(NULL, 5, 300)