我的存储函数使用以下命令创建临时 LOB 实例:Dbms_Lob.CreateTemporary(BUFFER, TRUE, Dbms_Lob.SESSION);
where BUFFER
是当地人CLOB
多变的。之后函数填充BUFFER
一些数据并返回它。
持续时间参数Dbms_Lob.CreateTemporary
就我而言是Dbms_Lob.SESSION
,但根据甲骨文文档 http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i1015757:
持续时间参数传递给 dbms_lob.createtemporary()是一个提示。
新临时 LOB 的持续时间与旧 LOB 的持续时间相同
PL/SQL 中的定位器变量。例如,在前面的程序中
块中,程序变量 a 具有驻留帧的持续时间。
因此,在块的末尾,a的内存将在
函数结束。
So BUFFER CLOB
离开功能块后可能会被 Oracle 销毁。我可以看到,在某些情况下,当 BUFFER 超过 32K 时,我无法读取从 Java(JDBC)端以这种方式返回的值。
还有其他方法可以从函数返回临时 CLOB 实例吗?
在评论中你说:
clob.getSubString(0, clob.length())
抛出:java.sql.SQLException:
Invalid argument(s) in call at
oracle.sql.CLOB.getSubString(CLOB.java:236)
while clob.length()
返回我的 clob 的实际长度
的文档getSubString http://docs.oracle.com/javase/6/docs/api/java/sql/Clob.html#getSubString%28long,%20int%29指出:
pos - 要提取的子字符串的第一个字符。第一个字符位于位置 1。
通过一个简单的函数来生成和返回 CLOB,我可以通过 JDBC 检索它(ojdbc5
or ojdbc6
)没有任何问题,或者getCLOB()
or getString()
。但如果我尝试分配Oracle.sql.CLOB
检索到getCLOB
to a String
using
String x = getSubString(0, clob.length());
然后我也得到了Invalid argument(s) in call
错误。只需将其更改为:
String x = getSubString(1, clob.length());
作品。所以它似乎与函数中的临时分配或 CLOB 大小无关。我不明白为什么你对较小的 CLOB 没有问题 - 也许如果它们很小,你的逻辑就不会遇到这个问题?
与此同时,您已经解决了这个问题clob.getCharacterStream().read()
,所以现在这可能有点无关紧要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)