本来就是clob,我是要转化为string(VARCHAR2),请问如何转,要在sql中转换

解决方案 »

  1.   

    在sql中直接读成String不行吧 clob 是用流读取的
      

  2.   

    byte[] b;
    clob.put(b);
    String str=new String(b);
      

  3.   

    曾经好象做过这样的,有点模糊了,不过大概意思是这样的
    byte[] b;
    clob.put(b);
    String str=new String(b);
      

  4.   

    在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。而LONG、LONG RAW等类型的字段,虽然存储容量也不小(可达2GB),但由于一个表中只能有一个这样类型的字段的限制,现在已很少使用了。 
    LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。
    下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。
    先建立如下两个测试用的数据库表,Power Designer PD模型如下:
     
    建表SQL语句为:
    CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)
    CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)
    一、 CLOB对象的存取
    1、往数据库中插入一个新的CLOB对象
    public static void clobInsert(String infile) throws Exception
    {
    /* 设定不自动提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);
    try {
    /* 插入一个空的CLOB对象 */
    stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");
    /* 查询此CLOB对象并锁定 */
    ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
    while (rs.next()) {
    /* 取出此CLOB对象 */
    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
    /* 向CLOB对象中写入数据 */
    BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
    BufferedReader in = new BufferedReader(new FileReader(infile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    /* 正式提交 */
    conn.commit();
    } catch (Exception ex) {
    /* 出错回滚 */
    conn.rollback();
    throw ex;
    }
    /* 恢复原提交状态 */
    conn.setAutoCommit(defaultCommit);
    }
    2、修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改)
    public static void clobModify(String infile) throws Exception
    {
    /* 设定不自动提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);
    try {
    /* 查询CLOB对象并锁定 */
    ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
    while (rs.next()) {
    /* 获取此CLOB对象 */
    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
    /* 进行覆盖式修改 */
    BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
    BufferedReader in = new BufferedReader(new FileReader(infile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    /* 正式提交 */
    conn.commit();
    } catch (Exception ex) {
    /* 出错回滚 */
    conn.rollback();
    throw ex;
    }
    /* 恢复原提交状态 */
    conn.setAutoCommit(defaultCommit);

    3、替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象)
    public static void clobReplace(String infile) throws Exception
    {
    /* 设定不自动提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);
    try {
    /* 清空原CLOB对象 */
    stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");
    /* 查询CLOB对象并锁定 */
    ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
    while (rs.next()) {
    /* 获取此CLOB对象 */
    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
    /* 更新数据 */
    BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
    BufferedReader in = new BufferedReader(new FileReader(infile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    /* 正式提交 */
    conn.commit();
    } catch (Exception ex) {
    /* 出错回滚 */
    conn.rollback();
    throw ex;
    }
    /* 恢复原提交状态 */
    conn.setAutoCommit(defaultCommit);
    }
    4、CLOB对象读取
    public static void clobRead(String outfile) throws Exception
    {
    /* 设定不自动提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);
    try {
    /* 查询CLOB对象 */
    ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");
    while (rs.next()) {
    /* 获取CLOB对象 */
    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
    /* 以字符形式输出 */
    String content = new String();
    if (clob != null) {
              Reader is = clob.getCharacterStream();
              BufferedReader br = new BufferedReader(is);
              String s = br.readLine();
              while (s != null) {
                content += s;
                s = br.readLine();
              }
            }}
    } catch (Exception ex) {
    conn.rollback();
    throw ex;
    }
    /* 恢复原提交状态 */
    conn.setAutoCommit(defaultCommit);
    }
      

  5.   

    得到Clob之后调用如下代码就可以了.
    Clob content_Clob=getYourClog();
    long contentLength;
    String content=null;
    if(content_Clob!=null){
      contentLength=content_Clob.length();
      content=content_Clob.getSubString(1,(int)contentLength);
       }
      

  6.   

    to kingofhawks(蓝鹰) 我按你的这样做法,抛出了异常:
    java.sql.SQLException: 类型长度大于最大值
    .....
    ...
    java.sql.SQLException: 违反协议
    ....
    ...另外,我的环境:
    Oracle8i,ojdbc14.jar不知道这是为什么?先谢谢了
      

  7.   

    把你出异常的那部分代码贴出来看看,首先确保你的数据库表设计正确的哦:>另外我不知道8i的数据库是否支持Clob,以上代码是在Oracle 10g中通过.
      

  8.   

    8i也是支持的,只是可能一些细节不一样,我想LZ还是按照 softken2005() 和 kingofhawks(蓝鹰) 这样子做,应该是没有问题的。
      

  9.   

    to kingofhawks(蓝鹰) :我的问题已经解决,换了驱动(oracle.jar)就行了。
    谢谢
      

  10.   

    fanter(爱了就爱了) 我的问题已经解决,换了驱动(oracle.jar)就行了。
    谢谢
    ------------------------------------------------------
    你这个什么驱动啊?