无法在Java中从Linux服务器(Oracle DB)检索B文件数据
我正在尝试从安装在Linux服务器上的Oracle DB检索图像。我已打开与Oracle DB的连接,并编写了以下代码来读取图像文件:无法在Java中从Linux服务器(Oracle DB)检索B文件数据,java,linux,oracle,Java,Linux,Oracle,我正在尝试从安装在Linux服务器上的Oracle DB检索图像。我已打开与Oracle DB的连接,并编写了以下代码来读取图像文件: String sqlQuery2 = "SELECT DOC_CONTENT FROM GES_TRV_ASSIST_VISA_IMG_INTF_V T WHERE T.TRV_REQ_NUM = ?"; pst2 = DBHelper.getPrepareStatement(sqlQuery2, "getPDFStreamData", con); pst2
String sqlQuery2 = "SELECT DOC_CONTENT FROM GES_TRV_ASSIST_VISA_IMG_INTF_V T WHERE T.TRV_REQ_NUM = ?";
pst2 = DBHelper.getPrepareStatement(sqlQuery2, "getPDFStreamData", con);
pst2.setInt(1, 1181241);
rs2 = DBHelper.executeQueryUsingPrepareStatement(pst2, "getPDFStreamData");
BufferedInputStream input = null;
while(rs2.next()){
bfile = ((OracleResultSet)rs2).getBFILE (1);
}
System.out.println("getDirAlias() = " + bfile.getDirAlias());
System.out.println("getName() = " + bfile.getName());
System.out.println("fileExists() = " + bfile.fileExists()); //Throwing exception here
System.out.println("isFileOpen() = " + bfile.isFileOpen());
// now open the bfile to get the data
bfile.openFile();
// get the BFILE data as a binary stream
InputStream in = bfile.getBinaryStream();
int length;
// read the bfile data in 6-byte chunks
byte[] buf = new byte[6];
while ((length = in.read(buf)) != -1)
{
// append and display the bfile data in 6-byte chunks
StringBuffer sb = new StringBuffer(length);
for (int i=0; i<length; i++)
sb.append( (char)buf[i] );
我能够检索目录名和文件名,但它在bfile.fileExists处抛出异常,表示文件不存在,但文件位于提到的路径中。我关注了很多博客和教程,但没有结果。我的疑问是我有权访问Oracle DB,这够了吗?还是我也需要访问文件目录
为了更好地理解,我附上了我的oracle表格图像。有人能建议我如何从oracle数据库检索BFILE数据吗
为了在Oracle中成功创建B文件,请使用符号目录名:
create or replace directory DOC_CONTENT_DIR as '/home/storage/docs';
grant read, write on DOC_CONTENT_DIR to user1;
insert into GES_TRV_ASSIST_VISA_IMG_INTF_V values(1, 3, 'US', BFILENAME('DOC_CONTENT_DIR', 'image.jpeg'), 'image.jpeg');
commit;
除了在Oracle中授予权限外,Oracle用户还需要操作系统级别的适当访问权限:
chown oracle /home/storage/docs
此外,您需要修复此问题。这是错误的:
while(rs2.next()){
bfile = ((OracleResultSet)rs2).getBFILE (1);
}
如果预期结果中只有一行,只需编写:
rs2.next();
bfile = ((OracleResultSet)rs2).getBFILE (1);
如果没有帮助,请在问题中添加崩溃前程序的输出。引发了什么异常?请将完整堆栈跟踪添加到您的问题中。此代码很奇怪:while rs2.next{bfile=oraclresultsetrs2.getBFILE 1;}。超出结果集的最后一行,然后访问上一行的文件。//PFB堆栈跟踪java.sql.SQLException:ORA-22285:oracle.jdbc.dbaccess.DBError.throwsqleexceptiondberror.java:134 at oracle.jdbc.ttc7.TTIoer.processErrorTTIoer.java:289 atoracle.jdbc.ttc7.v8TTIBfile.java:989在oracle.jdbc.ttc7.v8TTIBfile.doesExistv8TTIBfile.java:262在oracle.jdbc.ttc7.TTC7Protocol.fileexisttc7protocol.java:2869在oracle.sql.lobdaccessimpl.fileexistslobccessimpl.java:1060在oracle.sql.BFILE.fileExistsBFILE.java:502I可能在几天内获得OS访问权限,一旦我获得访问权限,我将检查它并让您知道。如果我遇到任何问题,我会在这里发布我的输出。