ORA-19280: Несоответствие динамического типа XQuery: ожидаемое атомарное значение - полученный узел - PullRequest
0 голосов
/ 01 ноября 2018

Я написал хранимую процедуру в Oracle для чтения данных в XML с пространствами имен.

CREATE OR REPLACE PROCEDURE DynamicXQuery (fileName IN VARCHAR2) 
AS 
    V_TransactionId VARCHAR2(50);

    XPath VARCHAR2(200) := '/message/soap:Envelope/soap:Body/v01:recordTrans';
BEGIN
        SELECT
            X.trans_id
          INTO  
                V_TransactionId 
          FROM  TABLE_WITH_XML_COLUMN T,
                XMLTABLE(
                         XMLNAMESPACES(
                                       'http://schemas.xmlsoap.org/soap/envelope/' as "soap",                            'http://comml.thesoaprequest.com/transactionrecording/v01/' as "v01"
                                      ),
                         '$fullXPath'
                         PASSING T.XML_DOCUMENT, XPath as "fullXPath" 
                         COLUMNS 
                           trans_id VARCHAR2(15) PATH 'transactionIdentifier'
                        ) X
          WHERE T.FILENAME = fileName;

Получение ошибки как 'ORA-19280: Несоответствие динамического типа XQuery: ожидаемое атомарное значение - полученный узел'

Пожалуйста, сообщите.

спасибо, Бхушан

1 Ответ

0 голосов
/ 01 ноября 2018

Краткий ответ: трудно использовать что-либо, кроме буквальной строки, в качестве строки XQuery при вызове XMLTABLE, и вы пытаетесь сделать именно это. Вам придется как-то избегать использования динамических выражений XQuery.

Вы не можете достичь того, чего хотите, поместив выражение XQuery в переменную $fullPath и используя эту переменную в строке XQuery. Это не заставляет Oracle оценивать выражение XQuery /message/soap:Envelope/soap:Body/v01:recordTrans в вашем XML-документе. Вместо этого он заставляет Oracle оценивать выражение XQuery '/message/soap:Envelope/soap:Body/v01:recordTrans' в вашем XML-документе. Это просто буквальная строка. Это может быть литеральная строка, которая содержит выражение XQuery, но это просто строка, которая оценивает себя. Затем вы не можете найти значение дочернего узла с именем transactionIdentifier, потому что строка - это просто значение, у нее нет дочерних узлов.

Если вам нужно только одно значение из документа XML, вы можете просто использовать EXTRACTVALUE, который не имеет такой проблемы с переменными выражениями XPath, например:

   SELECT EXTRACTVALUE(
            xml_document,
            XPath || '/transactionIdentifier',
            'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v01="http://comml.thesoaprequest.com/transactionrecording/v01/"'
          )
     INTO V_TransactionId
     FROM table_with_xml_column t
    WHERE t.filename = p_fileName;

См. Также аналогичный вопрос , в котором в основном говорится, что ответ на ваш вопрос в конечном итоге

не используйте переменную в качестве XQuery_string [...].

...