Oracle UpdateXML не принимает допустимый xPath

У меня есть столбец XML в XMLTYPE, который выглядит следующим образом:

<n:ROOT xmlns:app="http://company/acms/content/DocType" xmlns:n="http://company/acms/content/DocType">
   <Content>
      <Definition>
         <Code>DocType</Code>
         <Version>1</Version>
      </Definition>
      <DocType>
         <Info>
            <DocumentType>DocType</DocumentType>
            <DocumentClass>Other</DocumentClass>
            <CustomerID>12323423</CustomerID>
            <FinancialAccountID>12312312</FinancialAccountID>
            <MSISDN>34534534</MSISDN>
            <CustomerType>Consumer</CustomerType>
            <CustomerSubType>Consumer-Platinum</CustomerSubType>
            <FirstName>Name</FirstName>
            <ServiceType>ServiceType</ServiceType>
            <DocumentSource>BadValueHere</DocumentSource>
            <BoxReferenceNumber>BoxXXX</BoxReferenceNumber>
            <Industry>OTHERS</Industry>
            <CreationDate>2015-01-01</CreationDate>
            <DocumentID>6666</DocumentID>
            <CreatedBy>UBIX</CreatedBy>
            <DocumentOrigin>HD</DocumentOrigin>
            <Notes>Document location on File System: /path/to/doc.TIF</Notes>
            <Resource parseType="none">
               <URL>/path/filename.pdf</URL>
               <FileName>filename.pdf</FileName>
               <MimeType>image/tiff</MimeType>
            </Resource>
            <FileType>tiff</FileType>
         </Info>
         <Permissions>
            <GroupPermissions>
               <GroupName>99</GroupName>
               <Permissions>C</Permissions>
            </GroupPermissions>
            <GroupPermissions>
               <GroupName>30</GroupName>
               <Permissions>W</Permissions>
            </GroupPermissions>
            <GroupPermissions>
               <GroupName>66</GroupName>
               <Permissions>R</Permissions>
            </GroupPermissions>
         </Permissions>
      </DocType>
   </Content>
</n:ROOT>

Теперь мне нужно обновить элемент DocumentSource до нового значения.

Я попробовал следующий запрос:

SET CONTENT_DATA =  UPDATEXML(CONTENT_DATA,
   '/n:ROOT/Content/DocType/Info/DocumentSource/text()', 'Test')
where CONTENT_ID=6666;

Однако, когда я пытаюсь запустить его, я получаю сообщение об ошибке Oracle: Ошибка SQL: ORA-31013: Недопустимое выражение XPATH 31013. 00000 — «Недопустимое выражение XPATH» * Причина: выражение XPATH, переданное функции, недопустимо. *Действие: проверьте выражение xpath на возможные синтаксические ошибки.

Документация по UpdateXML находится на: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions205.htm он говорит о 5-м элементе для указания пространства имен, но мне не повезло заставить его работать :( Нет абсолютно никаких примеров того, как использовать это в моем сценарии в Google...

Может ли кто-нибудь из экспертов помочь?


person Carmageddon    schedule 07.11.2016    source источник


Ответы (1)


Просто попробуйте xpath: //Content/DocType/Info/DocumentSource/text()

person SomeDude    schedule 07.11.2016
comment
Извините, старый комментарий удален - он не работал с извлечением select, НО работает с UPDATEXML! :) Почему? Я хочу понять это лучше... - person Carmageddon; 08.11.2016
comment
Я не очень хорошо разбираюсь в среде Oracle (хотя я знаю, как трудно создавать хорошие сообщения об ошибках, когда команда разработчиков становится слишком большой...). По сути, синтаксис выражения XPath в порядке, поэтому наиболее вероятной ошибкой является то, что префикс пространства имен n не связан ни с одним URI. Таким образом, вам нужно либо выяснить, как этот конкретный API-интерфейс XPath позволяет вам связывать префиксы пространств имен, либо вам нужно переписать выражение таким образом, чтобы не требовались никакие привязки пространств имен. @svasa выбрал последний подход, который ленив, но в данном случае отлично работает. - person Michael Kay; 08.11.2016
comment
Спасибо, Майкл. Я знаю, что ошибка связана с пространством имен из всех моих вчерашних поисков в Google, но ни одного примера того, как использовать 5-й параметр функции для пространства имен. Запрос на обновление выполняется медленно. Сейчас работает 2 часа, требуется обновить более 10 миллионов записей. Может ли это быть из-за того, что простой обходной путь без указания пространства имен заставляет его работать медленнее? - person Carmageddon; 08.11.2016
comment
Ошибка операции обновления: Ошибка SQL: ORA-04030: нехватка памяти процесса при попытке выделить 55600 байт (qmcxdDecodeIni, qmemNextBuf:Large Alloc) 04030. 00000 — нехватка памяти процесса при попытке выделить %s байтов (%s, %s) *Причина: Частная память процесса операционной системы исчерпана *Действие: Есть идеи? - person Carmageddon; 08.11.2016