【问题标题】:insert bulk xml data into single table将批量 xml 数据插入单个表
【发布时间】:2017-03-23 19:36:38
【问题描述】:

我试图从 xmltable 执行 INSERT INTO .. SELECT。该过程在没有此插入的情况下成功(快速)完成,但是当包含此代码以插入 9999 行时,它需要时间来完成,但表中没有任何记录。

文件片段:

<xyzcompany xmlns="http://www.xyzcompany.com/Canonical" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pmt="http://xyzcompany.com/PmtInfo" xmlns:cmn="http://xyzcompany.com/CommonTypes">
<Pmt>
<pmt:Payments>
<pmt:PayInfo>
<pmt:Single>
<pmt:SingExtRef>HH00000066530</pmt:SingExtRef>
<pmt:SingSequence>0001</pmt:SingSequence>
<pmt:SingAddInfo>
   <cmn:AddInfoCmpType>IndivID</cmn:AddInfoCmpType>
   <cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
   <cmn:AddInfoCmpText>30UAT23203</cmn:AddInfoCmpText>
</pmt:SingAddInfo>
<pmt:SingAddInfo>
  <cmn:AddInfoCmpType>Transaction Reference</cmn:AddInfoCmpType>
  <cmn:AddInfoCmpText>062001180000553</cmn:AddInfoCmpText>
</pmt:SingAddInfo>
<pmt:SingAddInfo>
<cmn:AddInfoCmpType>EntryDesc</cmn:AddInfoCmpType>
<cmn:AddInfoCmpText>TRADE PYMT</cmn:AddInfoCmpText>
</pmt:SingAddInfo>
<pmt:SingAddInfo>
<cmn:AddInfoCmpType>ACH Company ID</cmn:AddInfoCmpType>
<cmn:AddInfoCmpText>1444444444</cmn:AddInfoCmpText>
</pmt:SingAddInfo>
<pmt:SingAddInfo>
<cmn:AddInfoCmpType>PmtRelInfo0001</cmn:AddInfoCmpType>
<cmn:AddInfoCmpText>IV</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>UAT9999_00001</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>100.01</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
</pmt:SingAddInfo>
<pmt:SingAddInfo>
<cmn:AddInfoCmpType>PmtRelInfo0002</cmn:AddInfoCmpType>
<cmn:AddInfoCmpText>IV</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>UAT9999_00002</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>100.01</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText>
</pmt:SingAddInfo>
</pmt:Single>
</pmt:PayInfo>
</pmt:Payments>
</Pmt>
</xyzcompany>

上述文件的 PMTRELINFO001 最多为 PMTRELINFO9999。我只需要抓取这些而不是其他数据,例如 INDIVID 并插入到目标表中。我的代码如下。

INSERT INTO ach_addenda(ach_id,rmr_number,rmr_code,invoice_number,rmr_paid_amt,rmr_orig_amt,rmr_disc_amt,rmr_date,ref_code,ref_id,ref_name,ref_instructions,adx_instructions,
        ent_number)
        (SELECT app_data_seq.currval, 

                 sing_d1.sing_info_type,
                 sing_d1.sing_info_text1,
                 sing_d1.sing_info_text2,
                 sing_d1.sing_info_text3,
                 sing_d1.sing_info_text4,
                 sing_d1.sing_info_text5,
                 sing_d1.sing_info_text6,
                 sing_d1.sing_info_text7,
                 sing_d1.sing_info_text8,
                 sing_d1.sing_info_text9,
                 sing_d1.sing_info_text10,
                 sing_d1.sing_info_text11,
                 sing_d1.sing_info_text12


            FROM XMLTABLE (
                    xmlnamespaces (
                       'http://www.xyzcompany.com/Canonical' AS "xyz",
                       'http://xyzcompany.com/PmtInfo' AS "pmt",
                       'http://xyzcompany.com/CommonTypes' AS "cmn",
                       'http://www.w3.org/2001/XMLSchema-instance' AS "xsi"),
                    '/xyz:xyz/xyz:Pmt/pmt:Payments/pmt:PayInfo/pmt:Single/pmt:SingAddInfo[cmn:AddInfoCmpType = "PMTREL%"]'
                    PASSING payXml
                    COLUMNS sing_info_type VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpType',
                            sing_info_text1 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[1]',
                            sing_info_text2 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[2]',
                            sing_info_text3 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[3]',
                            sing_info_text4 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[4]',
                            sing_info_text5 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[5]',
                            sing_info_text6 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[6]',
                            sing_info_text7 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[7]',
                            sing_info_text8 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[8]',
                            sing_info_text9 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[9]',
                            sing_info_text10 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[10]',
                            sing_info_text11 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[11]',
                            sing_info_text12 VARCHAR2(4000)
                                  PATH 'cmn:AddInfoCmpText[12]'
                            ) sing_d1
                            );

感谢任何提高效率和使插入工作的建议。我也尝试过带有附加提示的插入,没有区别。

Oracle 数据库 11g 企业版版本 11.2.0.3.0 - 64 位生产
PL/SQL 版本 11.2.0.3.0 - 生产
核心 11.2.0.3.0 生产
适用于 Solaris 的 TNS:版本 11.2.0.3.0 - 生产
NLSRTL 版本 11.2.0.3.0 - 生产

【问题讨论】:

  • “完成需要时间。”那是什么意思?几小时、几周、几年?你做了承诺吗?你提到,“程序”。这是在 pl/sql 过程中吗?
  • 无提交。完成该过程大约需要 15 分钟,卡在插入语句上,但没有插入记录,执行时没有产生错误。减去代码块,需要 30 秒。
  • 那么如果你只是运行上面SQL的“select”部分,它会返回数据吗? “卡住”是什么意思?如果某处没有提交,您为什么期望表中有数据?我很困惑。

标签: sql oracle plsql xmltable oracle-xml-db


【解决方案1】:

我发现您的查询中有 3 个错误。

   XMLTABLE (
                    xmlnamespaces (
                       default 'http://www.xyzcompany.com/Canonical',
                       'http://xyzcompany.com/PmtInfo' AS "pmt",
                       'http://xyzcompany.com/CommonTypes' AS "cmn",
                       'http://www.w3.org/2001/XMLSchema-instance' AS "xsi"),
                    '/xyzcompany/Pmt/pmt:Payments/pmt:PayInfo/pmt:Single/pmt:SingAddInfo[contains(upper-case(cmn:AddInfoCmpType),"PMTREL")]'
                    PASSING a ).

1) 根节点是xyzcompany 而不是xyz

2) http://www.xyzcompany.com/Canonical 是默认命名空间,应该以这种方式装饰default 'http://www.xyzcompany.com/Canonical',

3) cmn:AddInfoCmpType = "PMTREL%" 在 xquery 中没有 like 运算符。可以换成pmt:SingAddInfo[contains(upper-case(cmn:AddInfoCmpType),"PMTREL")]

【讨论】:

  • 感谢您修改条款。问题的性能部分仍然有效,它在插入 9999 行时已经运行了近 20 分钟。有任何想法吗?我应该使用提示吗?
  • 尝试在选择中不带任何参数的NO_MERGE,在插入中尝试parallel
  • INSERT /*+ PARALLEL(4) */ INTO .. SELECT /*+ NO_MERGE */ ... 没有帮助。我禁用了所有约束以允许直接加载。
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多