PLSQL:将xml值插入表中而不指定列

时间:2019-07-01 10:45:11

标签: xml oracle plsql

我使用dbms_xmlgen.getxmltype生成了一个包含表中所有行的xml:

select dbms_xmlgen.getxmltype('select * from MyTable') from dual;

所以我有一个像这样的xml:

    <ROWSET>
    <ROW>
     <ID>1</ID>
     <SURNAME>Smith</SURNAME>
      <NAME>John</NAME>
      <ADDRESS>XXX</ADDRESS>
    </ROW>
    <ROW>
     <ID>2</ID>
     <SURNAME>Allen</SURNAME>
     <NAME>Jim</NAME>
     <ADDRESS>YYY</ADDRESS>
     </ROW>
   </ROWSET>

是否可以在不指定任何列名的情况下,将上述XML中的值重新插入到同一张表中?

2 个答案:

答案 0 :(得分:2)

dbms_xmlsave可以为您做到这一点。以最基本的形式

declare
   myxml clob;
   rowsv number;
   ctx dbms_xmlsave.ctxType;
begin null;
   my_xml := --  XML data
   ctx := dbms_xmlsave.newcontext('myTable');
   rows := dbms_xmlsave.insertxml(ctx,myxml);
   dbms_xmlsave.closecontext(ctx);
end;
/

Oracle documentation

答案 1 :(得分:1)

  

是否可以将上述XML中的值重新插入到相同的值中   表上没有指定任何列名?

您可以按照下面的演示所示进行操作:

--Table having xml
CREATE TABLE xml_tab (  xml_data  XMLTYPE);

--Inserting xml                       
INSERT INTO xml_tab VALUES ( '<ROWSET>
                            <ROW>
                             <ID>1</ID>
                             <SURNAME>Smith</SURNAME>
                              <NAME>John</NAME>
                              <ADDRESS>XXX</ADDRESS>
                            </ROW>
                            <ROW>
                             <ID>2</ID>
                             <SURNAME>Allen</SURNAME>
                             <NAME>Jim</NAME>
                             <ADDRESS>YYY</ADDRESS>
                             </ROW>
                           </ROWSET>'
);
--Selecting xml
SELECT * FROM xml_tab;                        

--Table to insert records
CREATE TABLE xmtab (
    id        NUMBER,
    surname   VARCHAR2(50),
    name      VARCHAR2(50),
    address   VARCHAR2(50)
);

--Inserting into XMTAB
INSERT INTO XMTAB
SELECT xt.*
FROM xml_tab x,
    XMLTABLE('/ROWSET/ROW'
     PASSING x.xml_data
     COLUMNS
      ID          NUMBER       PATH 'ID',
      SURNAME     VARCHAR2(50) PATH 'SURNAME',
      NAME        VARCHAR2(50) PATH 'NAME',
      ADDRESS     VARCHAR2(50) PATH 'ADDRESS'
          ) xt
;