Trabajando con XML en campos CLOB en Oracle

Si guardáis XML en campos CLOB (o BLOB) de una base de datos Oracle, podéis modificarlos sin necesidad de descargarlos y volver a subirlos o crear una aplicación para tratarlos.

En Oracle existe el tipo XMLType para manejar los datos XML fácilmente desde Oracle y gracias a las funciones que ofrece, se pueden manejar directamente los XML en consultas (select) o bien, con scripts (o funciones, procedimientos, etc…)

EXTRACTVALUE(xmltype(campo_lob), ‘/nodo1/subnodo’) as “pregunta seguridad”.
Mediante el uso de la función ExtractValue de Oracle, podemos indicar un tipo LOB como parámetro, existente en el campo “campo_lob” , transformándolo antes al tipo XMLType, que es un tipo nativo de Oracle usado para el manejo de XML. Como segundo parámetro se indican la ruta en XPATH (corresponde a las etiquetas xml) donde se encuentra el valor.

SELECT EXTRACTVALUE(xmltype(testclob), '/DCResponse/ContextData/Field[@key="Decision"]') 
FROM traptabclob;

to_clob(INSERTCHILDXML(xmltype(campo_lob),’/nodo1′, ‘subnodo2’,XMLType(‘<subnodo2>’||valor||'</subnodo2>’)))
Mediante el uso de la función INSERTCHILDXML, indicamos el campos donde queremos guardar el lob, y puesto que trabajamos con XML, realizamos la conversión con XMLType. El segundo parámetro hace referencia a la ruta en formato XPATH donde se estará la nueva etiqueta y el tercer parámetro corresponde con la etiqueta que se incluirá junto a su valor, convirtiéndola siembre mediante la función XMLType. Quedaría:

<nodo1>
   <subnodo>valor1</subnodo>
   <subnodo>valor</subnodo>
   <subnodo2>valor</subnodo2> 
</nodo1>

to_clob(deleteXML(xmltype(campo_lob),’/nodo1/subnodo’))
Parecido al anterior para borrar la etiqueta pasada como segundo parámetro. Cuidado porque si hay varias etiquetas que coincidan en ese ruta, tal y como se observa en el siguiente XML, borraría todas. Si queréis borrar, por ejemplo solo la segunda, debéis usar ‘/nodo1/subnodo[2]’

<nodo1>
   <subnodo>valor1</subnodo>
   <subnodo>valor</subnodo>
</nodo1>

Mediante SQL Fiddle podréis crear todos tipos de problemas para resolverlos sin necesidad de ejecutarlos en vuestra base de datos. Aquí tenéis el ejemplo con EXTRACTVALUE sacado de StackOverflow.

Fuentes:

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s