Как добавить текст в существующий узел XML без использования UPDATEXML? - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь обновить свои данные xml, но это позволяет обновлять до 4000 символов.Я решил разделить их и обновить 1000-1000 символов в цикле, поэтому мне нужно будет добавить XML вместо обновления всего этого.

вот мой код:

сначала яразделить данные:

String[] mydata=mydata.split("(?<=\\G.{1000})")

, затем я использую updatexml в цикле:

for(int i=0; i<comments.length; i++){
        select = "update datadocumentxml d\n" +
                    "   set d.datadocumentxml = updatexml(xmltype(d.datadocumentxml),'/CB_Data/Example/@Comment', ?)\n" + 
        //          "                                   .getClobVal(),\n" + 
                    "                                   
                    " where d.processengineguid = fnguidjava2raw(?)\n" + 
                    "   and d.datadocumentid = 'CB_Data'";
        ps = conn.prepareStatement(select);
                    ps.setString(1,comment);

        //ps.setString(1,comments[i]);
        ps.setString(2,processid);
        rs = ps.executeQuery();

Так что в основном я пытаюсь обновить данные 1000 каждый раз, но они перезаписываются, так как яЯ использую updatexml.

Когда я запускаю это, если данные состоят из 1500 символов, они будут отображать только последние 500 символов, и это совершенно очевидно.но есть ли способ обновить XML без перезаписи предыдущих данных?чтобы я мог добавлять данные каждый раз в цикле?извините, если мне неясно, это мой первый вопрос здесь.

1 Ответ

0 голосов
/ 04 апреля 2019

Я пытался воспроизвести вашу проблему с ограничением в 4000 символов, так как не мог поверить, что это так, и фактически я не столкнулся с этим ограничением (12.1.0.2). Смотрите ниже, этот код уже должен быть вашим решением:

create table tst (datadocumentxml clob);
insert into tst values ('<root>');
-- this adds a little over 500 chars, run this 10 times
update tst set datadocumentxml = datadocumentxml || '<send>whistle</send>
  <back>
    <travel>giant</travel>
    <son>844851954</son>
    <may>-2056575796.4096966</may>
    <larger>
      <flow>1293043813</flow>
      <since>plastic</since>
      <orbit>please</orbit>
      <won>angle</won>
      <power>-704746039</power>
      <molecular>420367029</molecular>
    </larger>
    <rocky>727548108</rocky>
    <youth>-761804169.1209936</youth>
  </back>
  <tin>attention</tin>
  <suddenly>southern</suddenly>
  <similar>language</similar>
  <rabbit>captain</rabbit>';
-- this adds your example now  
update tst set datadocumentxml = datadocumentxml || '<CB_Data><Example Comment = "com1">example text</Example></CB_Data>';
-- before the next line add 10 times the 500 lines again
-- now we add the closing tag
update tst set datadocumentxml = datadocumentxml || '</root>';
commit;

-- this update does now work for me to append 'com2' to the existing comment
update tst d set d.datadocumentxml = updatexml(xmltype(d.datadocumentxml),'/root/CB_Data/Example/@Comment', 
(select extractvalue(xmltype(d.datadocumentxml),'/root/CB_Data/Example/@Comment') from tst d)
||' '||'com2').getclobval();

select * from tst;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...