在java存储过程中创建java.sql.blob实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在java存储过程中创建java.sql.blob实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3780字,纯文字阅读大概需要6分钟。
内容图文
![在java存储过程中创建java.sql.blob实例](/upload/InfoBanner/zyjiaocheng/911/e768b23d2f6e4342a49709974afb51dd.jpg)
这是我第一次在stackoverflow中发布一个问题,
我需要编写一个创建excel文件的java存储过程,并返回一个包含文件数据的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: inconsistent datatypes: expected a return value that is an
instance of a user defined Java class convertible to an Oracle type
got an object that could not be converted
有没有人遇到过这个问题,如果有的话你可以分享一下你是如何度过这个问题的.
先感谢您.
编辑
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编程很新
解决方法:
我错了.可以办到.花了一些时间让它工作,但是,最后,这是一个有效的例子:
Java类
import oracle.jdbc.driver.*;
public class TestBlob {
public static oracle.sql.BLOB getBlob(String username) throws Exception {
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(username.getBytes());
outStr.flush();
return retBlob;
}
}
如您所见,我已将oracle.sql.BLOB用于结果.我使用BLOB类的静态createTemporary方法创建它,指定它应该在会话期间创建(oracle.sql.BLOB.DURATION_SESSION参数).
然后,我获取OutputStream并写入数据.需要冲洗.
数据库方面
create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
AS LANGUAGE JAVA NAME
'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';
测试:
DECLARE
l_blob BLOB;
BEGIN
l_blob := getBlobWrp('test');
dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;
输出:
test
(上一个答案)
我认为你的test_create_excel函数中应该有一个IN OUT BLOB参数(将其更改为一个过程),并在Java存储方法中对该参数进行操作.我曾经看过那种方法.
在调用test_create_excel之前,您应该创建一个BLOB对象:
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
编辑
我不认为你想做的事情是可能的.但是,您可以将上面的代码包装在另一个函数中.它有点乱,但是你会有一个返回blob的函数:
CREATE OR REPLACE FUNCTION get_excel_blob(p_username VARCHAR2) RETURN BLOB
AS
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel(p_username, l_blob);
RETURN l_blob;
END;
内容总结
以上是互联网集市为您收集整理的在java存储过程中创建java.sql.blob实例全部内容,希望文章能够帮你解决在java存储过程中创建java.sql.blob实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。