需求是这样的:
老表中的varchar字段,现在要改成blob字段,为了防止数据丢失,需要把varchar字段先提出来,经过处理,存到有blob类型的新表中
老表 sitebook
     dnid  number
    book   varchar2(200)
新表 testbook
    dnid  number
    book   blob
我想问如何处理varchar 存到blob中

解决方案 »

  1.   

    select * into testbook from sitebook 
      

  2.   

    楼主说的
    需要把varchar字段先提出来,经过处理,存到有blob类型的新表中 
    思路应该是对的。但要注意:数据库中提供了两种字段类型 Blob 和 Clob 用于存储大型字符串或二进制数据(如图片)。 Blob 采用单字节存储,适合保存二进制数据,如图片文件。 
    Clob 采用多字节存储,适合保存大型文本数据。 Oracle中处理BLOB/CLOB字段的方式比较特别,所以需要特别注意下面两点: 1. 在Oracle JDBC中采用流机制对 BLOB/CLOB 进行读写操作,所以要注意不能在批处理中读写 BLOB/CLOB字段,否则将出现 
    Stream type cannot be used in batching 异常。 2. Oracle BLOB/CLOB 字段本身拥有一个游标(cursor),JDBC通过游标对Blob/Clob字段进行操作,
    在Blob/Clob字段创建之前,无法获取其游标句柄,会出现 
    Connection reset by peer: socket write error 异常。 
      

  3.   

    正确的做法是:首先创建一个空 Blob/Clob 字段,再从这个空 Blob/Clob字段获取游标,例如下面的代码: PreparedStatement ps = conn.prepareStatement( " insert into PICTURE(image,resume) values(?,?) " ); 
    // 通过oralce.sql.BLOB/CLOB.empty_lob()构造空Blob/Clob对象 
    ps.setBlob( 1 ,oracle.sql.BLOB.empty_lob()); 
    ps.setClob( 2 ,oracle.sql.CLOB.empty_lob()); ps.excuteUpdate(); 
    ps.close(); // 再次对读出Blob/Clob句柄 
    ps = conn.prepareStatement( " select image,resume from PICTURE where id=? for update " ); 
    ps.setInt( 1 , 100 ); ResultSet rs = ps.executeQuery(); 
    rs.next(); oracle.sql.BLOB imgBlob = (oracle.sql.BLOB)rs.getBlob( 1 ); 
    oracle.sql.CLOB resClob = (oracle.sql.CLOB)rs.getClob( 2 ); // 将二进制数据写入Blob 
    FileInputStream inStream = new FileInputStream( " c://image.jpg " ); 
    OutputStream outStream = imgBlob.getBinaryOutputStream(); byte [] buf = new byte [ 10240 ]; 
    int len; 
    while (len = inStream.read(buf) > 0 ) { 
    outStream.write(buf, 0 ,len); 

    inStream.close(); 
    outStream.cloese(); // 将字符串写入Clob 
    resClob.putString( 1 , " this is a clob " ); // 再将Blob/Clob字段更新到数据库 
    ps = conn.prepareStatement( " update PICTURE set image=? and resume=? where id=? " ); 
    ps.setBlob( 1 ,imgBlob); 
    ps.setClob( 2 ,resClob); 
    ps.setInt( 3 , 100 ); ps.executeUpdate(); 
    ps.close();
      

  4.   

    我用的hibernate  要求是将string 转成 二进制然后存到Blob 中,请问如何实现
      

  5.   

    LZ要把String类型数据插入数据库 .为什么要转成二进制 ??
    把类型改为:CLOB 不就好了。 .
      

  6.   

    把varchar中的字符串用getBytes()转成byte数组就OK了
      

  7.   

    String 怎么转成 byte呢???byte是否能输入到blob???
    我老表中的数据是String 现在要改成blob存储!!!!!谁知道??加满粉100~~~
      

  8.   

    改为CLOB  存储不行吗??
      

  9.   

    set 的时候 :String.valueOf(字符串.getBytes());
      

  10.   

    如何新建 BLOB bbb = new BLOB(???, ??);
      

  11.   

    问题解决了直接new 一个Blob直接就可以set了。。郁闷,网上那些文章,到底是出于什么目的说的那么复杂。