繁体   English   中英

反向Oracle dbms_xmlgen.getxmltype()-即我可以SQL查询xmltype行集以获取表结果吗?

[英]Reverse Oracle dbms_xmlgen.getxmltype() - ie can I SQL query an xmltype rowset to get back table results?

转换myTableWithManyColsAndRows-> myTableWithOneXmlTypeColumn如下:

declare
  result   xmltype;
begin
  result := dbms_xmlgen.getxmltype('select * from myTableWithManyColsAndRows')
  insert into table myTableWithOneXmlTypeColumn values result;
end;

我可以做相反的转换吗:myTableWithOneXmlTypeColumn-> myTableWithManyColsAndRows?

也就是说,我可以以某种方式构造一个查询myTableWithOneXmlTypeColumn并返回与“ select * from myTableWithManyColsAndRows”相同的结果的SQL语句吗?

--Creating a sample table with four columns and inserting random data.
create table myTableWithManyColsAndRows(
  id_ number,
  col1 varchar2(10),
  col2 number,
  col3 date
);

insert into myTableWithManyColsAndRows
select level, dbms_random.string('l', round(dbms_random.value(5,10))), round(dbms_random.value(1,100)),
        to_date(round(dbms_random.value(2455928,2457024)),'J')
from dual
connect by level <= 7;

--Query to generate XML from the table.
select dbms_xmlgen.getxmltype('select * from myTableWithManyColsAndRows') from dual;

DBMS_XMLGEN.GETXMLTYPE('SELECT*FROMMYTABLEWITHMANYCOLSANDROWS')
-----------------------------------------------------------------
<ROWSET>
 <ROW>
  <ID_>1</ID_>
  <COL1>ajfwmcaet</COL1>
  <COL2>79</COL2>
  <COL3>18-DEC-2013 00:00:00</COL3>
 </ROW>
 <ROW>
  <ID_>2</ID_>
  <COL1>wagvymnl</COL1>
  <COL2>13</COL2>
  <COL3>08-FEB-2012 00:00:00</COL3>
 </ROW>
 <ROW>
  <ID_>3</ID_>
  <COL1>jvlrv</COL1>
  <COL2>45</COL2>
  <COL3>28-DEC-2014 00:00:00</COL3>
 </ROW>
 <ROW>
  <ID_>4</ID_>
  <COL1>xirqutl</COL1>
  <COL2>29</COL2>
  <COL3>12-NOV-2012 00:00:00</COL3>
 </ROW>
 <ROW>
  <ID_>5</ID_>
  <COL1>rtdtmselx</COL1>
  <COL2>75</COL2>
  <COL3>26-JAN-2012 00:00:00</COL3>
 </ROW>
 <ROW>
  <ID_>6</ID_>
  <COL1>acvvw</COL1>
  <COL2>70</COL2>
  <COL3>19-SEP-2014 00:00:00</COL3>
 </ROW>
 <ROW>
  <ID_>7</ID_>
  <COL1>kbcmhh</COL1>
  <COL2>62</COL2>
  <COL3>26-MAY-2013 00:00:00</COL3>
 </ROW>
</ROWSET>

要从XML获取行和列,您需要使用XMLTable 标签有多个标签。 因此,第一步是提取这些内容并映射到XMLType(xmlrow)。 从中,提取各个列。

with myTableWithOneXmlTypeColumn(xmlcol) as (
    select dbms_xmlgen.getxmltype('select * from myTableWithManyColsAndRows') from dual
    )
select cols.id_ id_, cols.col1 col1, cols.col2 col2, to_date(cols.col3,'dd-mon-yyyy hh24:mi:ss') col3
from myTableWithOneXmlTypeColumn x,
XMLTABLE('ROWSET'
PASSING x.xmlcol
COLUMNS xmlrow xmltype PATH 'ROW'
)   xmlrows,
XMLTABLE('ROW'
PASSING xmlrows.xmlrow
COLUMNS id_ number PATH 'ID_',
    col1 varchar2(10) PATH 'COL1',
    col2 number PATH 'COL2',
    col3 varchar2(20) PATH 'COL3'
)   cols;

       ID_ COL1             COL2 COL3
---------- ---------- ---------- --------------------------
         1 ajfwmcaet          79 18-DEC-2013 00:00:00
         2 wagvymnl           13 08-FEB-2012 00:00:00
         3 jvlrv              45 28-DEC-2014 00:00:00
         4 xirqutl            29 12-NOV-2012 00:00:00
         5 rtdtmselx          75 26-JAN-2012 00:00:00
         6 acvvw              70 19-SEP-2014 00:00:00
         7 kbcmhh             62 26-MAY-2013 00:00:00

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM