Sql 使用带引号的xpath时extractvalue失败

Sql 使用带引号的xpath时extractvalue失败,sql,oracle,Sql,Oracle,运行查询时出现“ORA-21560:参数3为空、无效或超出范围”错误: SELECT extractvalue(xmltype(blob2clob(shblobdata.blobdata)), '/booked-order/ads/online-content[name="quantity"]/value') FROM shblobdata WHERE id=...; 完全错误是: ORA-21560: argument 3 is null, invalid, or out of ra

运行查询时出现“ORA-21560:参数3为空、无效或超出范围”错误:

SELECT extractvalue(xmltype(blob2clob(shblobdata.blobdata)),
    '/booked-order/ads/online-content[name="quantity"]/value')
FROM shblobdata
WHERE id=...;
完全错误是:

ORA-21560: argument 3 is null, invalid, or out of range
ORA-06512: at "SYS.DBMS_LOB", line 978
ORA-06512: at "MORAS.BLOB2CLOB", line 14
21560。00000-“参数%s为空、无效或超出范围”

*原因:参数应为非null的有效值,但 传入的参数值为null、无效或超出范围。 示例包括LOB/文件的位置或大小 参数的值超出范围1到(4GB-1), 或者使用无效的打开模式打开文件等

*措施:检查您的程序并更正例程的调用者 不传递null、无效或超出范围的参数值

我曾尝试将“数量”更改为“数量”(将单引号更改为两个撇号),但出现了相同的错误

blob的内容是:

<?xml version="1.0" encoding="utf-8"?>
<booked-order>
    <ads>
        <online-content>
            <name>quantity</name>
            <value>19872</value>
        </online-content>
    </ads>
</booked-order>

量
19872

异常显然是由
BLOB2CLOB()
引发的,它不是Oracle内置的。这是你自己写的东西,或是从互联网上的某个地方摘取的东西。所以我们对此无能为力


更一般的一点是,为什么要将XML存储在BLOB中?最好的方法是将其存储在定义为Oracle的XMLTYPE数据类型的列中。否则,将其存储为CLOB

异常显然是由
BLOB2CLOB()
引发的,它不是Oracle内置的。这是你自己写的东西,或是从互联网上的某个地方摘取的东西。所以我们对此无能为力


更一般的一点是,为什么要将XML存储在BLOB中?最好的方法是将其存储在定义为Oracle的XMLTYPE数据类型的列中。否则,将其存储为CLOB

问题出在自定义函数MORAS.BLOB2CLOB中

此外,错误消息清楚地显示了
ORA-06512:at“MORAS.BLOB2CLOB”,第14行

当您避开BLOB2CLOB并使用

SELECT EXTRACTVALUE (xmltype ( (shblobdata.blobdata)), '/booked-order/ads/online-content[name="quantity"]/value')
  FROM (SELECT '<?xml version="1.0" encoding="utf-8"?>
<booked-order>
    <ads>
        <online-content>
            <name>quantity</name>
            <value>19872</value>
        </online-content>
    </ads>
</booked-order>
' blobdata
          FROM DUAL) shblobdata
;

如果可以,请继续讨论XML部分。

问题出在自定义函数MORAS.BLOB2CLOB中

此外,错误消息清楚地显示了
ORA-06512:at“MORAS.BLOB2CLOB”,第14行

当您避开BLOB2CLOB并使用

SELECT EXTRACTVALUE (xmltype ( (shblobdata.blobdata)), '/booked-order/ads/online-content[name="quantity"]/value')
  FROM (SELECT '<?xml version="1.0" encoding="utf-8"?>
<booked-order>
    <ads>
        <online-content>
            <name>quantity</name>
            <value>19872</value>
        </online-content>
    </ads>
</booked-order>
' blobdata
          FROM DUAL) shblobdata
;

如果可以的话,请继续讨论XML部分。

您有
MORAS.BLOB2CLOB
的源代码吗?看起来这是一个如何调用另一个函数的问题,而不一定是BLOB中的数据;我认为它还没有发展到
extractvalue()
,甚至
xmltype()
。你有
MORAS.BLOB2CLOB
的源代码吗?看起来这是一个如何调用另一个函数的问题,而不一定是BLOB中的数据;我不认为它会发展到
extractvalue()
,甚至
xmltype()