Краткий ответ: трудно использовать что-либо, кроме буквальной строки, в качестве строки 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 [...].