oracle中clob或blob处理

 
oracle中clob或blob处理

create table DOCUMENT
(
    ID             NUMBER(16) not null,
    content clob null
)

注意:直接相关的两个包为:
import oracle.sql.CLOB;
import java.sql.PreparedStatement;

数据Insert处理:

try {
        conn = this.getConnection();
        conn.setAutoCommit(false);
        String id = this.getId("SEQ_document", conn);
        stmt = conn.createStatement();
        // 先将该记录插入到数据库中
        stmt.executeUpdate("insert into document(id,content) values("+id+",cmpty_clob)");
        // 然后更新该记录的content字段(该字段的类型为CLOB)
        updateContent(conn, id, contentValue); // contentValue为要插入到content字段的值
        conn.commit(); //事务结束
        conn.setAutoCommit(true);
      }
      catch (SQLException e) {
        try {
          conn.rollback();
          conn.setAutoCommit(true);
        }
        catch (SQLException ex) {
          ex.getMessage();
        }
        finally {
          throw new DAOException("Failed"+e.getMessage());
        }
      }
      finally {
        closeStatement(stmt);
        closeConnection(conn);
      }

    private void updateContent(Connection conn, String infoId,
                               DocumentModel model) {
      Statement stmt = null;
      ResultSet rs = null;
      try {
        stmt = conn.createStatement();
        String sql =
            "select content from document where id=" + infoId + " for update";
        rs = stmt.executeQuery(sql);
        if (rs.next()) {
          oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob(1);
          clob.putString(1, model.getContent());
          sql = "update document set content=? where id='" + infoId + "'";
          PreparedStatement pstmt = conn.prepareStatement(sql);
          pstmt.setClob(1, (java.sql.Clob) clob);
          pstmt.executeUpdate();
          pstmt.close();
        }
        this.closeResultSet(rs);
        this.closeStatement(stmt);
      }
      catch (SQLException e) {
        throw new DAOException("insert or update content failed!" + e.getMessage());
      }
    }

数据的修改处理:

针对数据的修改处理,如果修改这个表的其他字段,按正常的方式处理即可,如果要更新clob字段,则如下进行:假设要修改的记录的ID号为infoId:

    private void updateContent(Connection conn, String infoId,
                               DocumentModel model) {
      Statement stmt = null;
      ResultSet rs = null;
      try {
        stmt = conn.createStatement();
      stmt.executeUpdate("update document set content=empty_clob() where id='" + infoId + "'"); // 见下面的说明
        String sql =
            "select content from document where id=" + infoId + " for update";
        rs = stmt.executeQuery(sql);
        if (rs.next()) {
          oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob(1);
          clob.putString(1, model.getContent());
          sql = "update document set content=? where id='" + infoId + "'";
          PreparedStatement pstmt = conn.prepareStatement(sql);
          pstmt.setClob(1, (java.sql.Clob) clob);
          pstmt.executeUpdate();
          pstmt.close();
        }
        this.closeResultSet(rs);
        this.closeStatement(stmt);
      }
      catch (SQLException e) {
        throw new DAOException("insert or update content failed!" + e.getMessage());
      }
    }

说明:在修改之前一定要执行一次这句,否则会出现clob更新后的内容和自己实际的预期不相同的,即:假如更新之前clob字段的内容为 aaaaaa bbbbbb     ,用 11111 来更新之后,这个字段的值基本上会是类似于 11111 a bbbbbb  等,当然这时使用Oracle.sql.Clob包会出现的情形,如果使用weblogic.jdbc.vendor.oracle.OracleThinClob这个包来进行处理,是否有此现象没有试验过!这并非是什么BUG,只是Oracle.sql.CLOB的处理方式导致的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值