Bonjour à tous et à toutes,
Voici mon soucis :
J'ai une table issue d'un fichier xml que je génére de la sorte :
Pour pouvoir travailler sur cette table je génére une vue :Code:Insert into TMP_XML_CATEGORIES values(XMLTYPE(bfilename('FICHIER_IN_FB', 'categories.xml'), nls_charset_id('AL32UTF8')));
Tous les matins, je dois mettre à jour les données en fonction d'un fichier XML déposé sur le serveur.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 CREATE OR REPLACE VIEW CAT_CATEGORIES AS SELECT x.* FROM XMLTABLE (XMLNAMESPACES( DEFAULT 'http://api.bilboul.fr/bol/v1/categories'), 'for $i in ora:view("TMP_XML_CATEGORIES")/categories/category return element r { $i/@id, $i/label }' COLUMNS CAT_ID VARCHAR2(30) PATH '@id', CAT_LABEL VARCHAR2(20) PATH 'label' ) x;
Pour celà, je veux utiliser :
Mais comme la table TMP_XML_CATEGORIES ne contient qu'une ligne et q'une colonne : le fichier xml, je ne peux pas requêter dessus.Code:
1
2
3
4
5
6
7 MERGE INTO TMP_XML_CATEGORIES WHEN MATCHED UPDATE... WHEN NOT MATCHED INSERT...
J'ai essayé de faire ça :
Mais ça fonctionne pas. Dans l'absolu, je pourrai créer une table standard pour passer de TMP_XML_CATEGORIES à TBL_Categories et là je pourrai requêter dessus mais pour des raisons de performance, nous gardons la vue.Code:
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 MERGE INTO TMP_XML_CATEGORIES t USING ( SELECT * FROM XMLTABLE ( 'categories' passing v_xml columns CAT_ID VARCHAR2(32) PATH '@id', CAT_LABEL VARCHAR2(20) PATH 'label' ) ) r ON (r.cat_ID = (SELECT x.cat_id FROM XMLTABLE (XMLNAMESPACES( DEFAULT 'http://api.boulbil.fr/bol/v1/categories'), 'for $i in ora:view("TMP_XML_CATEGORIES")/categories/category return element r { $i/@id, $i/label }' COLUMNS CAT_ID VARCHAR2(32) PATH '@id', CAT_LABEL VARCHAR2(20) PATH 'label' )x)) WHEN MATCHED THEN UPDATE SET t.CAT_LABEL = r.cat_label WHEN NOT MATCHED THEN INSERT (CAT_ID,CAT_LABEL) VALUES (r.CAT_ID, r.cat_label); end;
Savez-vous comment faire ou avez vous une piste de réflexion ?
Merci d'avance