【发布时间】:2013-12-03 01:21:39
【问题描述】:
这是我第一次在stackoverflow上发帖, 我需要编写一个 java 存储过程来创建一个 excel 文件并返回一个包含文件数据(以字节为单位)的 blob。
我的pl/sql函数如下形式
function test_create_excel(i_username IN varchar2) return BLOB
AS LANGUAGE JAVA NAME 'NTO.Excel.ExcelFunctions.PushToExcel( java.lang.String ) return java.sql.Blob';
我的Java方法如下
public static java.sql.Blob TestPushToExcel(String username) throws IOException, SQLException{
//create excel file, read content to byte array and set to a blob
}
我的问题是我找不到任何方法来创建 java.sql.Blob 的实例,以便我可以使用 blob.setBinaryStream(..) 方法来写入文件数据字节数组。
我尝试使用 SerialBlob 实现,但会导致以下 oracle 错误
ORA-00932:不一致的数据类型:预期返回值是 可转换为 Oracle 类型的用户定义 Java 类的实例 得到一个无法转换的对象
有没有人遇到过这个问题,如果有,您可以分享一下您是如何解决的。
在此先感谢您。
编辑 JAVA
public static oracle.sql.BLOB getBlob(byte[] data) throws SQLException, IOException{
oracle.jdbc.OracleConnection conn = (oracle.jdbc.OracleConnection)new OracleDriver().defaultConnection();
oracle.sql.BLOB retBlob = oracle.sql.BLOB.createTemporary(conn, true, oracle.sql.BLOB.DURATION_SESSION);
java.io.OutputStream outStr = retBlob.setBinaryStream(0);
outStr.write(data);
outStr.flush();
return retBlob;
}
public static ExcelFileStore PushToExcel(String userId) throws IOException, SQLException{
ExcelFileStore fileStore = new ExcelFileStore();
fileStore.NU_USERID = userId;
fileStore.CreatedTime = new java.sql.Date(new Date().getTime());
fileStore.Last_Updated = new java.sql.Date(new Date().getTime());
fileStore.FileSize = fileData.length;
fileStore.FileData = getBlob(fileData);
return fileStore;
}
PL/SQL
function test_create_excel(i_username IN varchar2) return EXCELFILESTORE AS LANGUAGE JAVA NAME 'NTO.Excel.ExcelFunctions.PushToExcel( java.lang.String, ) return OracleObjects.ExcelFileStore';
OracleObject.ExcelfileStore是实现java.sql.SqlData的类,EXCELFILESTORE是oracle中的UDT。
我使用 'sys.dbms_java.loadjava' 加载了参考 jar 和为我的代码创建的 jar
我希望你能理解我的问题,因为我对 pl/sql 编程很陌生
【问题讨论】:
-
你不能在 oracle 中使用数据类型,只有支持的数据类型才有效。
-
这是我的错误,将我的代码粘贴到此处时,该方法不返回 ExcelFileStore。我编辑了我的问题,对此感到抱歉。
标签: java sql oracle stored-procedures