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