Oracle 10g+WebLogic8x下存取blob对象

原创 2006年06月15日 21:21:00

oracle10g的jdbc存在bug,在weblogic环境下处理的blob对象会出现错误:
encountered SQLException [ORA-01461: can bind a LONG value only for insert into a LONG column ]; nested exception is: java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column
针对这个问题,目前只能更改blob对象的处理方法以避免。
解决的思路是先向数据库里面插入一个空的blob对象,然后利用select ....for update语句单独向刚刚插入的行中放置blob对象,这两个操作要放在同一个事务中。同样,对于blob对象的更新问题,也需要,先把要替换的记录行的blob对象置空(EMPTY_BLOB()),然后再向里面插入blob对象。
代码如下:

/**
  * Oracle数据库附件专用方法
  */
 public static int insertDB(DataSource ds , String tableName, Map data) {
  if(ds==null)
  {
   throw new RuntimeException("DataSource is null");
  }
  
  byte[] temp = null;
  Object cols[] = data.keySet().toArray();
  Object vals[] = new Object[cols.length];
  
  /* 组织sql */
  StringBuffer colsSql = new StringBuffer();

  StringBuffer valsSql = new StringBuffer();
  for(int i=0; i<cols.length ; i++)
  {
   String key = (String) cols[i];
   Object value = data.get(key);
   vals[i] = value;
   if(key!=null && key.equals(WorkForm.COLUMN_NAME_SUBCONTENT))
   {
    temp =  UtilObject.getBytes(value);
   }
   if (i > 0) {
    colsSql.append(" ,");
    valsSql.append(" ,");
   }
   
   colsSql.append(key);
   
   if(key!=null)
   {
    if(key.equals(WorkForm.COLUMN_NAME_SUBCONTENT))
     valsSql.append("EMPTY_BLOB()");
    else
    { 
     if(key.equals(WorkForm.COLUMN_NAME_SUBTIME))
     {
      valsSql.append("SYSDATE");
      //valsSql.append("current_timestamp()");
     }
     else
     {
      valsSql.append("'")
          .append(value)
          .append("'");
     }
    }
   }
  }
  
  if(temp==null)
  {
   throw new RuntimeException("字节数组为空!");
  }
  /* 插入数据SQL */
  StringBuffer InsertSQL = new StringBuffer();
  InsertSQL.append("INSERT INTO ")
    .append(tableName)
    .append(" (")
    .append(colsSql.toString())
    .append(") VALUES (")
    .append(valsSql.toString())
    .append(")");
  
  /* 取出数据SQL */
  StringBuffer QuerySQL = new StringBuffer();
  QuerySQL.append("SELECT ")
    .append(WorkForm.COLUMN_NAME_SUBCONTENT)
    .append(" FROM ")
    .append(tableName)
    .append(" ")
    .append(" WHERE ID='")
    .append((String) data.get(WorkForm.COLUMN_NAME_SUBID))
    .append("' AND DATAID='")
    .append((String) data.get(WorkForm.COLUMN_NAME_DATAID))
    .append("' FOR UPDATE");
  
  /* 然后在从表中取出来,进行更新 */
  Connection conn = null;
  Statement stmt = null;
  boolean defaultCommit;
  ResultSet result = null;
  int returnValue = 0;
  
  try {
   conn = ds.getConnection();
   
   defaultCommit = conn.getAutoCommit();
   /* 设置为不能自动提交 */
   conn.setAutoCommit(false);
   stmt = conn.createStatement();
   /* 插入空的附件 */
   returnValue = stmt.executeUpdate(InsertSQL.toString());
   
   /* 查询此BLOB对象并锁定 */
   result = stmt.executeQuery(QuerySQL.toString());
   if (result == null) {
    throw new RuntimeException("result is null");
   }
   ResultSet rs = stmt.executeQuery(QuerySQL.toString());
   if (rs.next()) {
    weblogic.jdbc.wrapper.Blob blob = (weblogic.jdbc.wrapper.Blob) rs.getBlob(WorkForm.COLUMN_NAME_SUBCONTENT);
    oracle.sql.BLOB oblob = (oracle.sql.BLOB)blob.getVendorObj();
    OutputStream output = oblob.getBinaryOutputStream();
    ByteArrayInputStream inputStream = new ByteArrayInputStream(temp);
    int len = 0;
    while ((len = inputStream.read(temp)) != -1) {
     output.write(temp, 0, len);
    }
    inputStream.close();
    output.flush();
    output.close();
   }
   
   /* 正式提交 */
   conn.commit();
   stmt.close();
   conn.setAutoCommit(defaultCommit);
   
  } catch (IOException ioex) {
   throw new RuntimeException("IOException", ioex);
  }catch (SQLException ex) {
   ex.printStackTrace();
   try {
    conn.rollback();
   } catch (SQLException e) {
    throw new RuntimeException("回滚失败", e);
   }
  } finally {
   if (conn != null) {
    try {
     conn.close();
    } catch (SQLException e) {
     throw new RuntimeException("关闭连接失败", e);
    }
   }
  }
  return returnValue;
 }

JAVA存取CLOB和BLOB方法

[转载]http://blog.sina.com.cn/s/blog_8dd107fd0101fxsz.html z oracle大对象保存 java将blob转化byte 保存大对象文件 如何插入...
  • wgzwing_wing
  • wgzwing_wing
  • 2014年02月20日 11:25
  • 6489

使用 hibernate 存取大对象数据类型(clob和blob)

数据库表如下: book表 id 该表的主键。number类型。 photo 代表图书的图片,blob类型。 descripti...
  • z69183787
  • z69183787
  • 2013年11月22日 13:19
  • 16609

Blob对象和FileReader接口

Blob对象: 它表示二进制原始数据,提供一个slice方法,可以通过该方法访问到字节内部的原始数据快,file对象也继承了这个Blob对象 它有两个属性1.size属性:表示一个Blob对象的长度 ...
  • ziy10231207
  • ziy10231207
  • 2016年07月12日 16:22
  • 1376

CentOS 6.3(x86_64)下安装Oracle 10g R2

目 录 一、硬件要求 二、软件 三、系统安装注意 四、安装Oracle前的系统准备工作 五、安装Oracle,并进行相关设置 六、升级Oracle到patchset 10.2.0.4 七...
  • u013235026
  • u013235026
  • 2014年10月18日 21:36
  • 583

CentOS 6.4 (x86_64) 安装 Oracle 10g2 备记

1.  centos 6.4 桌面系统,卸载了自带的java7和不用的其它软件,不带openoffice等办公及娱乐软件,安装后yum update升级系统到最新,安装Qt4编译需要的开发包(参照) ...
  • cuterhei
  • cuterhei
  • 2013年04月03日 14:22
  • 1403

W8 64位操作系统安装Oracle 10g

Oracle 默认不支持win8操作系统,在安装之前先要修改Oracle的配置文件,否则会提示程序异常终止,无法安装。 我用的是Oracle 10.2 ,自行下载安装包,我的安装包目录如下:...
  • yang382197207
  • yang382197207
  • 2013年11月14日 10:06
  • 2357

在虚拟机上安装红帽Linux.5.5.for.x86.服务器版系统(按针对安装oracle 10g作的配置)

软件版本:虚拟机版本:vmwareworkstation 7.11 build-282343红帽5版本:[红帽Linux.5.5.for.x86.服务器版].rhel-server-5.5-i386-...
  • pxpdqz
  • pxpdqz
  • 2011年07月17日 21:21
  • 3332

【LINUX】在虚拟机上安装红帽Linux.5.5.for.x86.服务器版系统(按针对安装oracle 10g作的配置)

在虚拟机上安装红帽Linux.5.5.for.x86.服务器版系统(按针对安装oracle 10g作的配置) 分类: Oracle 2011-07-17 21:21 290人阅读 评...
  • kenkywu
  • kenkywu
  • 2011年12月08日 23:23
  • 1402

Oracle 10g 中 X$KCVFH 说明

一. X$表说明 之前整理了一篇有关动态性能视图的blog:Oracle 动态性能视图http://blog.csdn.net/tianlesoftware/article/details/58631...
  • tianlesoftware
  • tianlesoftware
  • 2011年10月30日 19:13
  • 6619

Orcale(一)----WIN7 X64下安装ORACLE 10g(检查操作系统版本: 6.1a等问题)

事出有因 解决方案 修改配置文件oraparamini 修改refhostxml文件 注意事项 事出有因最近在学习DRP,要用到Orcale数据库,由于本电脑注意是window10的系统,之前装过Or...
  • u010853701
  • u010853701
  • 2015年11月17日 22:23
  • 1948
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle 10g+WebLogic8x下存取blob对象
举报原因:
原因补充:

(最多只允许输入30个字)