2012-07-20 28 views
0

我收到“ORA-21560:参数3是空的,无效的,或超出范围”的错误上运行查询:extractValue一起使用XPath的带引号的失败

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位置或大小 参数通过(4GB - 1)具有范围为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> 
+0

你有'MORAS.BLOB2CLOB'的来源吗?看起来问题在于如何调用另一个函数,而不是BLOB中的数据;我认为它不如'extractvalue()',甚至是'xmltype()'。 – 2012-07-20 12:05:47

回答

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 with

SELECT blob2clob(shblobdata.blobdata) 
    FROM shblobdata 
WHERE id=...; 

如果能够正常工作,请继续阅读XML部分。

2

异常显然是由BLOB2CLOB()投掷,这不是一个Oracle内置。这是你自己写的东西,或者是从互联网上的某个地方解除的东西。所以我们没有太多的办法来帮助解决这个问题。

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