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程序与远程数据库打交道,这样就会省去不必要的麻烦。可能有人问,直接把远程数据库的连接配上不就得了,可是有的需求就是这样的,为了密码,必须使用数据库与数据库之间建立同义词。所以,我就想到了这样的办法,希望各位大虾有更好的办法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值