orcale中跨数据库写入BLOB数据

   最近遇到一个特殊的问题就是,在同一个orcale数据库中可以插入同义词的BLOB数据,可是一旦变成数据库对数据库同义词写入数据就会报错,报远程数据库log无法定位

所以在网上找了一点资料结合写下如下:

 

 String sql = "insert into sd_public_pic(xh, zpbh, zp, sltp, bz, zpbj, jlzt)values('" + xh
                + "',(select decode(max(e.zpbh),'',22000001,max(e.zpbh)) from bas_public_pic e)+" + num + ","
                + "empty_blob(),empty_blob(),'工作台账图片',1,1)";
        //首先将数据插入到本地数据库表中
        stmt = conn.createStatement();
        stmt.execute(sql);
        System.out.println("插入本地数据SQL;" + sql);

     
        sql = "select zp,sltp from sd_public_pic where zpbh=((select decode(max(e.zpbh),'',22000001,max(e.zpbh)) from bas_public_pic e)+" + num + ") for update";
       
        stm = conn.prepareStatement(sql);
        set = stm.executeQuery();
        System.out.println("插入本地数据SQL===>>" + sql);

          //定位本地BLOB字段,将BLOB数据插入
        // 创建流  
        BufferedInputStream in = new BufferedInputStream(new URL(zpUrl).openStream());
        if (set.next()) {
            oracle.sql.BLOB blob1 = (oracle.sql.BLOB) set.getBlob("zp");
            oracle.sql.BLOB blob2 = (oracle.sql.BLOB) set.getBlob("sltp");
           
            // 建立输出流 向blob对象中写入数据
            BufferedOutputStream out = new BufferedOutputStream(blob1.getBinaryOutputStream());
            BufferedOutputStream out1 = new BufferedOutputStream(blob2.getBinaryOutputStream());
            int c;
            while ((c = in.read()) != -1) {
                out.write(c);
                out1.write(c);
            }
            in.close();
            out.close();
            out1.close();
        }
        in.close();

 

                   conn.commit();
                //将本地数据提交给远程数据库
                sql = "insert into bas_public_pic(xh, zpbh, zpbj, zp, sltp, bz, jlzt)(select xh, zpbh, zpbj, zp, sltp, bz, jlzt from sd_public_pic)";
                System.out.println("图片插入:" + sql);
                stm = conn.prepareStatement(sql);
                set = stm.executeQuery();

其实整体的思路就是,在地建一个和远程数据库一样的临时表,先将BLOB数据插入到本地数据库中,然后将本地数据导入到本地数据库,这样就变成了数据库与数据库的通信,而不是JAVA程序与远程数据库打交道,这样就会省去不必要的麻烦。可能有人问,直接把远程数据库的连接配上不就得了,可是有的需求就是这样的,为了密码,必须使用数据库与数据库之间建立同义词。所以,我就想到了这样的办法,希望各位大虾有更好的办法!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 JDBC 向 Oracle 数据库写入 BLOB 类型数据的示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class WriteBlobToOracle { public static void main(String[] args) { // Oracle JDBC 驱动 String driver = "oracle.jdbc.driver.OracleDriver"; // 数据库连接信息 String url = "jdbc:oracle:thin:@localhost:1521:ORCL"; String user = "username"; String password = "password"; Connection conn = null; PreparedStatement pstmt = null; try { // 加载驱动程序 Class.forName(driver); // 获取数据库连接 conn = DriverManager.getConnection(url, user, password); // SQL 插入语句,参数使用 ? 占位符 String sql = "INSERT INTO blob_table (id, file_name, file_content) VALUES (?, ?, ?)"; // 创建 PreparedStatement 对象 pstmt = conn.prepareStatement(sql); // 设置参数 pstmt.setInt(1, 1); pstmt.setString(2, "test.txt"); // 读取文件内容到 InputStream 对象 File file = new File("test.txt"); InputStream is = new FileInputStream(file); // 设置 BLOB 类型参数 pstmt.setBinaryStream(3, is, (int) file.length()); // 执行 SQL 语句 int rowsAffected = pstmt.executeUpdate(); System.out.println(rowsAffected + " rows affected."); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭 PreparedStatement 和数据库连接 try { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 在上面的示例,我们使用 `setBinaryStream()` 方法将文件内容写入 BLOB 字段。该方法需要三个参数: - 参数索引:指定 BLOB 参数的位置,从 1 开始计数。 - InputStream 对象:包含要写入 BLOB 字段数据。 - BLOB 字段的长度:指定数据长度,使用文件的长度。 在插入数据之前,我们需要创建一个表来存储 BLOB 类型数据: ```sql CREATE TABLE blob_table ( id NUMBER(10) PRIMARY KEY, file_name VARCHAR2(50), file_content BLOB ); ``` 这个表包含三个字段: - `id`:表示唯一标识符。 - `file_name`:表示文件名。 - `file_content`:表示 BLOB 类型字段,用于存储文件内容。 最后,需要将文件 `test.txt` 放在项目根目录下,这个文件将被写入 BLOB 字段。如果需要写入其他文件,只需将文件名和路径更改为相应的值即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值