簡體   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