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
|