【问题标题】:ORA-19280: XQuery dynamic type mismatch: expected atomic value - got nodeORA-19280: XQuery 动态类型不匹配: 预期原子值 - 得到节点
【发布时间】:2018-11-02 04:45:48
【问题描述】:

我在 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 动态类型不匹配:预期的原子值 - 得到节点”

请指教。

谢谢, 布山

【问题讨论】:

    标签: plsql xmltable


    【解决方案1】:

    简短的回答是,在对XMLTABLE 的调用中很难使用文字字符串以外的任何内容作为XQuery 字符串,而您正试图这样做。您将不得不以某种方式避免使用动态 XQuery 表达式。

    您无法通过将 XQuery 表达式放入变量 $fullPath 并在 XQuery 字符串中使用该变量来实现您想要的。这不会导致 Oracle 在您的 XML 文档上计算 XQuery 表达式 /message/soap:Envelope/soap:Body/v01:recordTrans。相反,它会导致 Oracle 在您的 XML 文档上计算 XQuery 表达式 '/message/soap:Envelope/soap:Body/v01:recordTrans'。这只是一个文字字符串。它可能是一个包含 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;
    

    另见similar question,它基本上表明您的问题的答案是最终

    不要将变量用作 XQuery_string [...]。

    【讨论】:

    • EXTRACTVALUE 已弃用。
    • @XING:谢谢,我不知道。但是,它似乎仍然适用于 LiveSQL 上的 18c 版本,因此尚未删除。
    猜你喜欢
    • 2017-07-12
    • 2016-08-23
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多