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 :
Description de la table TEST :
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);
Control File :
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
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 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 '§'))
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)
Partager