вставить массовые данные xml в одну таблицу

Я пытался сделать INSERT INTO.. SELECT из xmltable. Процедура завершается успешно (быстро) без этой вставки, но когда этот код включен для вставки 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 Database 11g Enterprise Edition, выпуск 11.2.0.3.0 — 64-разрядная рабочая версия
PL/SQL, выпуск 11.2.0.3.0 — производственная
CORE 11.2.0.3.0 рабочая
TNS для Solaris: версия 11.2.0.3. 0 – Производство
Версия NLSRTL 11.2.0.3.0 – Производство


person QuickDrawMcgraw    schedule 09.11.2016    source источник
comment
для завершения требуется время. Что это обозначает? Часы, недели, годы? Вы сделали коммит? Вы упомянули, процедура. это в процедуре pl/sql?   -  person OldProgrammer    schedule 10.11.2016
comment
Нет фиксации. Выполнение процедуры занимает около 15 минут, зависает на операторе вставки, но записи не вставляются, при выполнении не возникает ошибка. Минус блок кода, занимает 30 секунд.   -  person QuickDrawMcgraw    schedule 10.11.2016
comment
Так что, если вы просто запустите часть select вышеприведенного SQL, он вернет данные? Что значит, застревает? Если где-то нет коммита, зачем вы ожидаете данные в таблице? Я смущен.   -  person OldProgrammer    schedule 10.11.2016


Ответы (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 нет подобного оператора. Его можно заменить на pmt:SingAddInfo[contains(upper-case(cmn:AddInfoCmpType),"PMTREL")]

person Arkadiusz Łukasiewicz    schedule 10.11.2016
comment
Спасибо за изменение пункта. Часть проблемы с производительностью все еще актуальна, она работает уже почти 20 минут при вставке 9999 строк. Любые идеи? Должен ли я использовать подсказки? - person QuickDrawMcgraw; 10.11.2016
comment
попробуйте с NO_MERGE без каких-либо аргументов в выборе и parallel в вставке - person Arkadiusz Łukasiewicz; 10.11.2016
comment
INSERT /*+ PARALLEL(4) */ INTO.. SELECT /*+ NO_MERGE */ ... не помогает. У меня отключены все ограничения, чтобы разрешить эту прямую загрузку. - person QuickDrawMcgraw; 10.11.2016