Bonjour à tous et à toutes,
Voici mon soucis :
J'ai une table issue d'un fichier xml que je génére de la sorte :
Insert into TMP_XML_CATEGORIES values(XMLTYPE(bfilename('FICHIER_IN_FB', 'categories.xml'), nls_charset_id('AL32UTF8')));
Pour pouvoir travailler sur cette table je génére une vue :
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; |
Tous les matins, je dois mettre à jour les données en fonction d'un fichier XML déposé sur le serveur.
Pour celà, je veux utiliser :
1 2 3 4 5 6 7
|
MERGE INTO TMP_XML_CATEGORIES
WHEN MATCHED UPDATE...
WHEN NOT MATCHED INSERT... |
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.
J'ai essayé de faire ça :
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; |
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.
Savez-vous comment faire ou avez vous une piste de réflexion ?
Merci d'avance
Partager