首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > Oracle 10g+WebLogic8x下存取blob对象
【标  题】:Oracle 10g+WebLogic8x下存取blob对象
【关键字】:Oracle,10g+WebLogic8x,blob
【来  源】:http://blog.csdn.net/merryzhao/archive/2006/06/15/800994.aspx

Oracle 10g+WebLogic8x下存取blob对象

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;
 }

5. 当事人角色:【上一篇】
ASP 获取 ACCESS 中新插入数据的 ID 或多个ID /Getting last insert ID/ By Stabx:【下一篇】
【相关文章】
  • 裸设备和Oracle问答20例(zz)
  • 判断oracle数据库是共享还是专用服务器模式。
  • oracle数据库学习论坛
  • oracle9i學習1
  • Oracle 10gR2 + RedHat Enterprise Linux AS4 安装
  • 查看ORACLE哪条SQL占资源最大
  • oracle数据字典-笔记
  • Oracle 中树结构查询
  • Linux环境设置Oracle随系统启动
  • 深入理解ORACLE数据库字符集
  • 【随机文章】
  • DataFit V7.0.36注册过程的分析(1)
  • php学习笔记6-(控制台程序)
  • 公司企业,个人,商务,1U 2U 4U 服务器托管,租用TEL:021-58627218-14(分机
  • 浅论如何有效的融合开发人员和测试人员
  • Dom遍历XML的一个例子,结果为树状结构
  • Oracle 数据库的备份与恢复
  • How to change columns in the database(postgre)
  • 部分未公开的Windows 2000核心功能调用
  • GPU Fluid Simulation
  • 添加交换空间
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.