Área de Tecnologías de la Información y las Comunicaciones Aplicadas
Área de Tecnologías de la Información y las Comunicaciones Aplicadas Universidad de Murcia
Área de Tecnologías de la Información y las Comunicaciones Aplicadas
ATICA arrow Consultoria arrow DBconnector arrow XML - XML desde SQL y PLSQL
24.05.2012
 
 
XML - XML desde SQL y PLSQL Imprimir E-mail
Oracle, ya en su verisón 8i, empezó a introducir capacidades de procesamiento XML en su motor de base de datos.

Esto es una Nota Técnica, más bien un "how-to", de cómo trabajar con XML desde SQL o PL/SQL.

Puedes descargar la versión PDF (576Kb) de este documento, si por cualquier motivo no se visualiza bien la versión HTML.

1.Obtener los datos de una tabla en formato XML.

1.1.Desde PL/SQL con DBMS_XMLGEN.

SQL>

DECLARE
  Ctx DBMS_XMLGEN.ctxHandle; -- Var's to convert SQL output to XML
  xml clob;
  emp_no NUMBER := 7369;
  xmlc varchar2(4000); -- Var's required to convert lob to varchar
  off integer := 1;
  len integer := 4000;
BEGIN
  Ctx := DBMS_XMLGEN.newContext('SELECT * FROM emp WHERE empno = '||emp_no);
  DBMS_XMLGen.setRowsetTag(Ctx, 'EMP_TABLE');
  DBMS_XMLGen.setRowTag(Ctx, 'EMP_ROW');
  xml := DBMS_XMLGEN.getXML(Ctx);
  DBMS_XMLGEN.closeContext(Ctx);
  DBMS_LOB.READ(xml, len, off, xmlc); -- Display first part on screen
  DBMS_OUTPUT.PUT_LINE(xmlc);
END;


SQL> /

<?xml version="1.0"?>
<EMP_TABLE>
<EMP_ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>17-DEC-80</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</EMP_ROW>
</EMP_TABLE>

PL/SQL procedure successfully completed.

1.2.Desde SQL usando funciones de SQLX.

Como XMLelement(), XMLForest(), XMLSequence(), etc.

SQL> set long 32000

SQL>

SELECT XMLELEMENT("EMP_TABLE",
(select XMLELEMENT("EMP_ROW",
XMLFOREST(empno, ename, job, mgr, hiredate, sal, deptno)
)
from emp
where empno = 7369))
from dual;

XMLELEMENT("EMP_TABLE",(SELECTXMLELEMENT("EMP_ROW",XMLFOREST(EMPNO,ENAME,JOB,MGR
--------------------------------------------------------------------------------
<EMP_TABLE><EMP_ROW><EMPNO>7369</EMPNO><ENAME>SMITH</ENAME><JOB>CLERK</JOB><MGR>
7902</MGR><HIREDATE>17-DEC-80</HIREDATE><SAL>800</SAL><DEPTNO>20</DEPTNO></EMP_R
OW></EMP_TABLE>

2.Almacenar datos XML en una tabla y leerlos.

SQL> create table XMLTable (doc_id number, xml_data XMLType);
Table created.
SQL>
insert into XMLTable values (1,
XMLType('<FAQ-LIST>
<QUESTION>
<QUERY>Question 1</QUERY>
<RESPONSE>Answer goes here.</RESPONSE>
</QUESTION>
</FAQ-LIST>'));

1 row created.

SQL>
select extractValue(xml_data, '/FAQ-LIST/QUESTION/RESPONSE') -- XPath expression
from XMLTable
where existsNode(xml_data, '/FAQ-LIST/QUESTION[QUERY="Question 1"]') = 1;

EXTRACTVALUE(XML_DATA,'/FAQ-LIST/QUESTION/RESPONSE')--XPATHEXPRESSION
--------------------------------------------------------------------------------
Answer goes here.

3.Crear un índice sobre datos XML.

SQL> create index XMLTable_ind on XMLTable
                (extractValue(xml_data, '/FAQ-LIST/QUESTION/QUERY') );

Index created.

4.Referencias


Autor: Juan Luis Serradilla - 7/5/2008

Última modificación ( 28.03.2012 )
 
Área de Tecnologías de la Información y las Comunicaciones Aplicadas
Volver al incio del documento Volver al inicio del documento
Área de Tecnologías de la Información y las Comunicaciones Aplicadas