Ir al contenido principal

Extraer un elemento de XML con EXTRACT desde una tabla en Oracle con Namespace.

Ejemplo con una tabla con campo XML
CREATE TABLE mytablechar ( id, xmlcolumn ) AS
SELECT
1,
'<report xmlns:nsl="http://xmlns.oracle.com/ns/order">
<nsl:InquireUnifiedCustomerProfileByServiceLocationRequest>
<AccountIdentifier>
<AddressIdentifier>
<AddressId>MyAddress 1020, North Hampton, Va</AddressId>
<FullCriteria>1</FullCriteria>
</AddressIdentifier>
</AccountIdentifier>
</nsl:InquireUnifiedCustomerProfileByServiceLocationRequest>
</report>'
FROM DUAL;
WITH
xmlData
AS
(SELECT
XMLTYPE(t.xmlcolumn) xml
FROM
mytablechar t
where t.id = 1 )
SELECT
x.xml.EXTRACT(
'/report/ns1:InquireUnifiedCustomerProfileByServiceLocationRequest/AccountIdentifier/AddressIdentifier/addressId',
'xmlns:ns1="http://xmlns.oracle.com/ns/order"').getStringVal()
FROM
xmlData x;

CREATE TABLE mytableclob (id number, xmlcolumn clob);

INSERT INTO mytableclob
SELECT
1,
'<report xmlns:nsl="http://xmlns.oracle.com/ns/order">
<nsl:InquireUnifiedCustomerProfileByServiceLocationRequest>
<AccountIdentifier>
<AddressIdentifier>
<AddressId>MyAddress 1020, North Hampton, Va</AddressId>
<FullCriteria>1</FullCriteria>
</AddressIdentifier>
</AccountIdentifier>
</nsl:InquireUnifiedCustomerProfileByServiceLocationRequest>
</report>'
FROM DUAL;

COMMIT;

WITH
xmlData
AS
(SELECT
XMLTYPE(t.xmlcolumn) xml
FROM
mytableclob t
WHERE
t.id = 1)
SELECT
x.xml.EXTRACT(
'/report/ns1:InquireUnifiedCustomerProfileByServiceLocationRequest/AccountIdentifier/AddressIdentifier/AddressId',
'xmlns:ns1="http://xmlns.oracle.com/ns/order"').getStringVal()
FROM
xmlData x;

WITH
xmlData
AS
(SELECT
XMLTYPE(t.xmlcolumn) xml
FROM
mytablechar t
WHERE
t.id = 1)
SELECT
x.xml.EXTRACT(
'/report/ns1:InquireUnifiedCustomerProfileByServiceLocationRequest/AccountIdentifier/AddressIdentifier/AddressId',
'xmlns:ns1="http://xmlns.oracle.com/ns/order"').getStringVal()
FROM
xmlData x;

drop table mytablechar;

drop table mytableclob;

La salida de este comando al ejecutarlo como script es

Table MYTABLECHAR creado. X.XML.EXTRACT('/REPORT/NS1:INQUIREUNIFIEDCUSTOMERPROFILEBYSERVICELOCATIONREQUEST/ACCOUNTIDENTIFIER/ADDRESSIDENTIFIER/ADDRESSID','XMLNS:NS1="HTTP://XMLNS.ORACLE.COM/NS/ORDER"').GETSTRINGVAL() ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Table MYTABLECLOB creado. 1 fila insertadas. Confirmación terminada. X.XML.EXTRACT('/REPORT/NS1:INQUIREUNIFIEDCUSTOMERPROFILEBYSERVICELOCATIONREQUEST/ACCOUNTIDENTIFIER/ADDRESSIDENTIFIER/ADDRESSID','XMLNS:NS1="HTTP://XMLNS.ORACLE.COM/NS/ORDER"').GETSTRINGVAL() ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- <AddressId>MyAddress 1020, North Hampton, Va</AddressId> X.XML.EXTRACT('/REPORT/NS1:INQUIREUNIFIEDCUSTOMERPROFILEBYSERVICELOCATIONREQUEST/ACCOUNTIDENTIFIER/ADDRESSIDENTIFIER/ADDRESSID','XMLNS:NS1="HTTP://XMLNS.ORACLE.COM/NS/ORDER"').GETSTRINGVAL() ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- <AddressId>MyAddress 1020, North Hampton, Va</AddressId> Table MYTABLECHAR borrado. Table MYTABLECLOB borrado.

Comentarios

Entradas populares de este blog

Mejorar el rendimiento de una actualización con Bulk Collect

Hace unos días nos llegó una solicitud para mejorar el rendimiento de una actualización que corre sobre una tabla relativamente grande, de alrededor de 350 Gb, particionada pero esta actualización en específico no está optimizada para hacer uso de la estructura ni los índices existentes. Usualmente iniciamos por hacer una tabla intermedia de manera temporal, sobre la que corre un cursor que va lanzando actualizaciones. Se le rebajó algo de tiempo pero recordé que se puede optimizar este tipo de operaciones utilizando una operación que hace uso de las colecciones conocida como bulk collect. Para utilizar el bulk collect, se necesita primero crear una variable de tipo tabla donde se meterán los datos llave a utilizar para la actualización. Bulk collect tiene una opción llamada limit, que limita la cantidad de registros que se guardan en la colección para no acabarnos la memoria de programa en caso de ser millones de registros. Después de esto, se utiliza una operación...

Cláusula WITH y hint MATERIALIZE

Hace unos días me llegó una consulta con una cláusula 'WITH' que presentaba problemas con la ejecución, tomaba demasiado tiempo. Para los que no están familiarizados, aquí explico cómo funciona la cláusula WITH. Cláusula WITH La cláusula WITH nació en el estándar SQL 99 y es un poco críptico ya que se presenta con una sintaxis reversa de los queries normales, se utiliza para mejorar las consultas anidadas. Utilizando el ejemplo de Oracle con el esquema SCOTT, aquí estan los queries: SELECT e.ename AS employee_name, dc.dept_count AS emp_dept_count FROM emp e JOIN (SELECT deptno, COUNT(*) AS dept_count FROM emp GROUP BY deptno) dc ON e.deptno = dc.deptno; Modificando para utilizar WITH queda así: WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count FROM emp GROUP BY deptno) SELECT e.ename AS employee_name, dc.dept_count AS emp_dept_count FROM emp e JOIN dept_count dc ON e.deptno = dc....