Oracle XMLQUERY - удалить все пустые узлы под root - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть запрос:

  SELECT  DELETEXML(xmltype('<docGetResponse>
                            <histories>
                              <history>
                                <history/>
                              </history>
                            </histories>
                            <validations/>
                          </docGetResponse>'), '/docGetResponse/*[not(node())]')

  FROM    dual;

МОЯ цель - удалить ВСЕ ПУСТЫЕ узлы в docGetResponse.В этом случае сверху должно остаться xml

<docGetResponse></docGetResponse> 

ИЛИ

<docGetResponse/>

Но запрос выдает ошибку: ORA-21500: внутренний код ошибки, аргументы: [% s], [% s], [% s], [% s], [% s], [% s], [% s], [% s]

Есть идеи?

1 Ответ

0 голосов
/ 14 декабря 2018

1) У вас есть внутренняя ошибка.
2) DELETEXML - это устаревшая функция sql, и ее следует заменить с помощью xmlquery.
3) Правильная версия xquery - '/docGetResponse/*[not(.//text())]'

  select xmlquery('copy $doc := . 
                modify delete nodes $doc/docGetResponse/*[not(.//text())] 
                return $doc' 
         passing xmltype('<docGetResponse>
                            <histories>
                              <history>
                                <history/>
                              </history>
                            </histories>
                            <validations/>                            
                            <xxx>
                              <a><b><c>av</c></b></a>
                            </xxx>
                          </docGetResponse>') returning content) from  dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...