Extrait de valeur spécifique de CLOB (contenant du XML), tout en créant une chaîne délimitée par la ligne d'une table. CLOB valeur peut être nulle sur certaines lignes
Le Contexte:
La base de données est Oracle. Je suis en train de créer une chaîne délimitée par la ligne d'une table. Certaines des valeurs de la chaîne délimitée doit venir de CLOBs (contenant du XML). Le CLOBs peut être nulle sur certaines lignes et c'est là que réside le problème.
Par exemple, j'ai une Table: "Item" avec les lignes suivantes: 'Item_ID', 'Item_CD', 'Item_TXT' (CLOB). La table dispose de deux lignes. Une ligne a la suite de XML stockés dans 'Item_TXT", l'autre ligne "Item_TXT" est null.
<OuterTag>
<InnerTag>test</InnerTag>
</OuterTag>
J'ai créé le SQL suivant pour retourner les 3 premiers éléments de la chaîne délimitée:
SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
FROM Item;
Cela a fonctionné avec succès:
Élément%#12345%#Un
Élément%#123456%#Un
J'ai ensuite essayé d'ajouter le 4ème élément (valeur de CLOB).
SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item;
Cela a échoué avec l'erreur suivante:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1
J'ai rétréci cette question à, parfois, la Item_TXT est nulle et XMLTYPE() ne peut pas gérer cela. Pour le prouver, j'ai couru le suivant:
SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item
WHERE Item_TXT IS NOT NULL;
Cela a fonctionné avec succès:
Élément%#12345%#%#test
Est-il de toute façon de traiter l'ensemble de la table, extraire de la valeur de clob si disponible, sinon l'ajout d'null/rien à chaîne délimitée?
OriginalL'auteur James Gallagher | 2013-02-28
Vous devez vous connecter pour publier un commentaire.
la raison de cette erreur est que le
xmltype
constructeur est vicié par null lobs. Personnellement j'ai toujours utiliserxmltype.createxml(item_txt)
à la place. vous trouverez qu'il fonctionne aussi bien sans avoir à se souciernvl
etc.OriginalL'auteur DazzaL
Essayez d'utiliser nvl:
Voici une sqlfiddle démo
Ou vous pouvez utiliser un CAS déclaration :
OriginalL'auteur A.B.Cade