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

标签 java oracle plsql readfile

我正在尝试在 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/

相关文章:

java正则表达式提取方括号内的内容

java - 如何使用 Guice 注入(inject)包私有(private)类

c# - 检查 Oracle.DataAccess 是否存在

java - 将 Excel 单元格内容附加到新的 Excel 文件

java - 针对时间戳列的 Oracle SQL where 子句

sql - Bash sqlplus 连接不是来自 root

mysql - PL SQL 触发器在更新单列时更新行的开始时间

oracle - 如何修改oracle 12c表空间的最大大小

java - 使用 '%' 作为 Java 中 SQL 参数中的通配符

java - 如何正确通知此适配器其数据集已更改?