日期:2014-05-17  浏览次数:21271 次

oracle函数返回long raw类型的时候,貌似有长度限制,100K以上会被截断!
我在java应用程序中调用oracle函数,返回一个long raw类型的字节流,100K以下内容是全的。超过100K就截断了。
是不是哪里能设置oracle数据库函数返回长度的最大值?疑惑中

------解决方案--------------------
long raw 能保存2G的内容。。。是不是你java侧的原因呢。
------解决方案--------------------
直接使用PLSQL或SQLPLUS调用函数能返回正确的结果么?建议把函数内容贴出来以供参考
------解决方案--------------------
不知道这个原因。。没有搞过Java。。
不过你可以放心。在Oracle中是没有这个问题的。
------解决方案--------------------
RemoteFileObject.getRemoteFileObject(java.lang.String) return java.lang.String

这个函数返回的是什么样的字符串?LONG RAW只能保存二进制数据,所以不知道是否是string转换到ORACLE字符串,ORACLE字符串再转换为LONG RAW。如果是这样,那就有可能会被截断。。。
------解决方案--------------------
只能建议不要使用函数直接接收byte[]数组作为返回值,中间不知道ORACLE会做什么样的数据类型转换。建议直接将byte[]内容插入到表中的long raw字段。试试这样是否可行吧。
------解决方案--------------------
引用:
Quote: 引用:

只能建议不要使用函数直接接收byte[]数组作为返回值,中间不知道ORACLE会做什么样的数据类型转换。建议直接将byte[]内容插入到表中的long raw字段。试试这样是否可行吧。


这当然是可行,我现在就这样做了,java sources里取得数据后先插入数据库中的一个blob字段,返回一个成功标志,java应用程序端取得成功标志,就去数据库中的blob字段取出数据。
但绕了弯子,还需要定期清理数据库的这些无用的数据。


其实你可以读取完了之后就清除这个数据,当你的程序稳定之后。或者在每次插入之前先清空表中的数据。对于JAVA函数和JAVA存储过程研究较少。

或者是可以尝试在函数中声明一个long raw的变量,JAVA函数先返回到变量,然后再return变量作为返回值,看看是否有效果。
----test函数----
create or replace function test(url varchar2) return LONG RAW  as
  language java name 'RemoteFileObject.getRemoteFileObject(java.lang.String) return byte[]';