【问题标题】:PLSQL: insert xml values into table without specifing columnsPL SQL:在不指定列的情况下将 xml 值插入表中
【发布时间】:2019-11-12 00:41:52
【问题描述】:

我使用 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 中的值重新插入到同一个表中?

【问题讨论】:

    标签: xml oracle plsql


    【解决方案1】:

    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

    【讨论】:

    • 它主要适用于日期列,但我收到此错误:ORA-29532 oracle.xml.sql.OracleXMLSQLException Unparseable date: "02-LUG-19"
    【解决方案2】:

    是否可以将上面 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
    ;
    

    【讨论】:

    • 这不是问题的范围。插入 XMTAB 必须在不指定列的情况下动态完成。
    • @Ork 要从XML 中提取值,您需要提及列名。 NOT 可能没有它。您仍然可以这样做,但数据将保存在一列而不是单独的列下。意味着如果您删除 COLUMNS ID NUMBER PATH 'ID', SURNAME VARCHAR2(50) PATH 'SURNAME', NAME VARCHAR2(50) PATH 'NAME', ADDRESS VARCHAR2(50) PATH 'ADDRESS',您仍然会获得 xmltype 类型的行,您可以将其插入到表中。顺便说一句,为什么您不想明确提及这些列?
    • 正如您在上面看到的,用户@Rene 提出了解决方案,这是可能的。他的解决方案的唯一问题是数据列格式。我需要这样做,因为我在多个表上都有备份过程,我不想为需要备份的每个表创建一个过程。
    • I need to do it because I've got backup procedures on multiple tables 。使用 XML 最糟糕的部分是它不是很方便,而且很难操作。尽管 Rene 解决方案似乎对您有用,但我仍然可以看到您面临一些错误。如果问题已经解决,您可以通过接受 Rene 的回答来结束问题
    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2020-02-18
    • 2022-10-12
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多