gpt4 book ai didi

java - 使用JAVA从Oracle数据库读取网络文件

转载 作者:行者123 更新时间:2023-12-01 10:45:23 25 4
gpt4 key购买 nike

我正在尝试在 Oracle 数据库中创建一个函数,该函数使用 JAVA 类从网络驱动器读取文件并将文件内容作为 BLOB 返回。

到目前为止,这是进度

JAVA代码-FileAPI.java

import java.lang.*;
import java.io.*;
import java.sql.*;

public class FileAPI
{
public static String readFile (String path, Blob[] outLob)
{
FileInputStream fileStream = null;
try {
fileStream = new FileInputStream(path);

byte[] buffer = new byte[100];
int i = 0;
/* for testing just read 100 bytes */
/* code required for reading full file */
i = fileStream.read(buffer, 1, 100);
outLob[0] = new javax.sql.rowset.serial.SerialBlob(buffer);

if(fileStream != null)
fileStream.close();

return "success";
}
catch (Exception e) {
return e.getMessage();
}
}
};

Oracle PL/SQL 函数

CREATE OR REPLACE FUNCTION readFile (p_path IN VARCHAR2, p_outlob IN OUT NOCOPY BLOB)
RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'FileAPI.readFile(
java.lang.String,
java.sql.Blob[]) return java.lang.String';

用于测试上述函数的 PL/SQL 匿名 block

SET SERVEROUTPUT ON;
DECLARE
l_temp BLOB;
l_res VARCHAR2(1000);
BEGIN
l_res := readFile('/mnt/servername/foldername/filename.txt',l_temp);
IF l_res = 'success'
THEN
DBMS_OUTPUT.PUT_LINE('Success, length '||dbms_lob.getlength(l_temp));
ELSE
DBMS_OUTPUT.PUT_LINE('Error info '|| l_res);
END IF;
END;
/

当我在 block 上方运行时,我没有收到任何错误信息。它只是打印“错误信息”。没有打印任何异常详细信息。

有人可以建议这里出了什么问题吗?

您还可以建议读取完整文件的内容并将其附加到 JAVA 中的 BLOB 变量(outLob[0])吗?

JAVA详细信息

java版本“1.7.0_79”Java(TM) SE 运行时环境(版本 1.7.0_79-b15)Java HotSpot(TM) 64 位服务器 VM(内部版本 24.79-b02,混合模式)

Oracle 数据库 - Oracle 11g r2 EE

最诚挚的问候,

[更新的JAVA代码]

import java.lang.*;
import java.io.*;
import java.sql.*;

public class FileAPI
{
public static String readFile (String path, Blob[] outLob)
{
FileInputStream fileStream = null;
Blob tmp = outLob[0];
try {
fileStream = new FileInputStream(path);

byte[] buffer = new byte[100];
int i = 0;
/* for testing just read 100 bytes */
/* code required for reading full file */
i = fileStream.read(buffer, 0, 100);
tmp = new javax.sql.rowset.serial.SerialBlob(buffer);
outLob[0] = tmp;

if(fileStream != null)
fileStream.close();

return "success";
}
catch (Exception e) {
//return e.getMessage();
return e.toString();
}
}
};

最佳答案

要直接从 Java 创建 Blob,您必须访问 Connection 对象并告诉数据库通过它创建 Blob;然后获取blob对象的输出流并写入它。

import oracle.jdbc.OracleDriver;

import oracle.sql.BLOB;

import java.io.FileInputStream;
import java.io.OutputStream;

import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;

public class FileAPI
{
public static String readFile(String path, Blob[] outLob)
{
try
{
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:default:connection:");
FileInputStream fileStream = null;
fileStream = new FileInputStream(path);

outLob[0] = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
OutputStream BlobOS = outLob[0].setBinaryStream(0);
byte[] buffer = new byte[100];

int len = fileStream.read(buffer, 0, 100);
while (len > -1)
{
BlobOS.write(buffer, 0, len);
len = fileStream.read(buffer, 0, 100);
}
BlobOS.close();
fileStream.close();

return "success";
}
catch (Exception e)
{
e.printStackTrace();
return e.toString();
}
}
}

您需要包含 Oracle JDBC 才能进行编译。 BLOB.createTemporary() 甚至可以在 Java 1.4.2 (oracle 10) 上使用;从 1.6 开始,有 createBlob sql.Connection 中的函数,应该执行相同的操作。

此外,这与您的问题有点无关,但请注意,您可以在数据库服务器上的 udump 日志中读取 Java 存储过程的标准输出(System.out 和 System.err),因此不要犹豫使用e.printStackTrace() - 它对调试有很大帮助。

关于java - 使用JAVA从Oracle数据库读取网络文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34219306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com