0

我在运行查询时收到“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 为空、无效或超出范围”

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

*操作:检查您的程序并更正例程的调用者以不传递空值、无效或超出范围的参数值。

我试图将“数量”更改为“数量”(将单引号更改为两个撇号),但得到了同样的错误。

blob的内容是:

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

2 回答 2

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 部分。

于 2012-07-20T12:15:41.843 回答
2

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

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

于 2012-07-20T12:08:21.193 回答