我在运行查询时遇到“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>
答案 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
我首先使用
调试你的函数blob2clobSELECT blob2clob(shblobdata.blobdata)
FROM shblobdata
WHERE id=...;
如果可以,那就继续使用XML部分。
答案 1 :(得分:2)
BLOB2CLOB()
显然引发了异常,这不是Oracle内置的。这是你自己写的东西,或者从互联网上的某个地方抬起来的东西。因此,我们无法帮助解决这个问题。
更一般的一点是,为什么要将XML存储在BLOB中?最好的方法是将其存储在定义为Oracle的XMLTYPE数据类型的列中。否则将其存储为CLOB。