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

时间:2012-07-20 11:34:46

标签: 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 range
ORA-06512: at "SYS.DBMS_LOB", line 978
ORA-06512: at "MORAS.BLOB2CLOB", line 14
  

21560。 00000 - “参数%s为空,无效或超出范围”

     

*原因:该参数期望一个非空的有效值,但是              传入的参数值为null,无效或超出范围。              示例包括LOB / FILE的位置或大小              参数的值超出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>

2 个答案:

答案 0 :(得分:3)

问题在于您的自定义函数MORAS.BLOB2CLOB。

此错误消息也清楚显示ORA-06512: at "MORAS.BLOB2CLOB", line 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
;

返回19872

我首先使用

调试你的函数blob2clob
SELECT blob2clob(shblobdata.blobdata)
  FROM shblobdata
 WHERE id=...;

如果可以,那就继续使用XML部分。

答案 1 :(得分:2)

BLOB2CLOB()显然引发了异常,这不是Oracle内置的。这是你自己写的东西,或者从互联网上的某个地方抬起来的东西。因此,我们无法帮助解决这个问题。

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