希望下面的可以解决你的问题http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/LOBSample/LOBSample.java.html

解决方案 »

  1.   

    上面的朋友,不行啊!他也是将java.sql.Blob强制转换成Oracle.sql.BLOB之后再写入Blob的
    我需要的是不用类型强制转换而写入!!!
    因为强制转换在JNDI环境下报异常!不能转换!!!!
      

  2.   

    一般来说,大对象存储是把文件存到数据库中,当然也可以内存中的超大字符串。对于象图片这样的文件当然是用二进制存储,这里有很多误区,网络上的教程99%都是行不通的,连SUN自己的文档都一直错误,虽然错误很小。按说二进制文件应该存为BLOB类型,但JBDC2并不能直接对BLOB存入二进制文件,如果你这样做,会得到一个IO而不是SQL异常,为此花了我近两个小时才弄清楚。   如果要把一个二制文件存入ORACLE,用标准的JDBC你就要用LONG ROW类型: create table tb_file(name varchar(20),detail long row);   然后 File file = new File("aaa.gif"); 
    int fileLength =(int) file.length(); 
    InputStream fin = new FileInputStream(file); 
    PreparedStatement pstmt = con.prepareStatement("insert into tb_file values('aaa.gif',?)"); 
    pstmt.setBinaryStream (1, fin, fileLength); 
    pstmt.executeUpdate();   如果你一定要用BLOB存储,你就必须用ORACLE自己的方法: create table tb_file(name varchar(20),detail BLOB); 
    con.setAutoCommit(false); 
    stmt.executeUpdate("insert into tb_file values('aaa.gif',empty_blob())");   下面必须SELECT得到BLOB的对象再向里写: rs = stmt.executeQuery("select detail from tb_file where name='aaa.gif' for upfdate" ); 
    if(rs.next()) 

    Blob blob = rs.getBlob(1); 
    BinaryOutputStream out = ((oracle.sql.BLOB)blob).getBinaryOutputStream(); 
    byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize]; 
    InputStream fin = new FileInputStream(file); 
    int len = 0; 
    while( (len = fin.read(b)) != -1) 
    out.write(b,0,len); 
    fin.close(); 
    out.close(); 
    con.commit(); 
    }   同样读取数据你并不能象LONG ROW那样 InputStream in = rs.getBinaryInputStream("detail");   而要 Blob blob = rs.getBlob("detail"); 
    in = blob.getBinaryStream(); 
      

  3.   

    以上是转贴的一个关于大数据存储的方法在Oracle中
    假定有一张表
    lob_table(blob_col Blob, clob_col clob)
    假定你创建了Statement Object, stmt// Select LOB locator into standard result set.
    ResultSet rs =
       stmt.executeQuery ("SELECT blob_col, clob_col FROM lob_table");
    while (rs.next())
    {
       // Get LOB locators into Java wrapper classes.
       java.sql.Blob blob = (java.sql.Blob)rs.getObject(1);
       java.sql.Clob clob = (java.sql.Clob)rs.getObject(2);
       (...process...)
    }输出强制转换为java.sql.Blob 和 java.sql.Clob,
    你接下来可以强制转换成oracle.sql.BLOB 和 CLOB,以便利用 oracle.sql.* 中class的扩展功能,你可以这样转换   // Get LOB locators into Java wrapper classes.
       oracle.sql.BLOB blob = (BLOB)rs.getObject(1);
       oracle.sql.CLOB clob = (CLOB)rs.getObject(2);
       (...process...)
      

  4.   

    You can use a BLOB column to serialize an object into a database. There is a problem serializing object > 4K into the db, but you can get round that in Oracle. You have to use the Oracle JNDI driver, and use class
    oracle.sql.BLOB. First INSERT the a new row using the EMPTY_BLOB()
    function
    e.g.                INSERT INTO blob_table VALUES ( ..., EMPTY_BLOB(), ..)Then do a SELECT for the BLOB column on that row. Use the ResultSet.getBlob() function to get an oracle.sql.BLOB object, serialze the object to a byte array, use the BLOB.setBytes() function so set the contents of the BLOB. Then you can UPDATE the previously created row, with your BLOB
    containing the serialized objectHope this file can answer your question
      

  5.   

    我看了上面的这段英文资料!
    oracle自带的jar包class12.jar里好像没有Oracle JNDI driver.
    也不知道这个驱动是否支持URL的连接查询!我就是用的就是先插入空对象,在对其更新!
    可是上面的说,先将Blob序列化成字节数组,然后用Blob.setBytes()方法进行写入!!!
      

  6.   

    我的问题是怎么将Blob类型的对象序列化,还有setBytes()有两个方法一个是:
    public int setBytes(long pos,byte[] bytes,int offset,int len)另一个是:
    public int setBytes(long pos,byte[] bytes)
    我没序列化对象,在调用这两个方法时出现异常:
    java.sql.SQLException: 不支持的特性
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
    at oracle.jdbc.dbaccess.DBError.throwUnsupportedFeatureSqlException(DBError.java:689)
    at oracle.sql.BLOB.setBytes(BLOB.java:954)
    能否告诉我怎么序列化Blob对象成字节数组和使用setBytes()!!
    非常感谢上面这个朋友的大力支持,花费您宝贵的休息时间,我再次表示衷心的感谢
      

  7.   

    郁闷死我了,这个问题困扰了我将近两周!!!
    现在终于解决了!!这个所谓类型转换异常主要是因为oracle.jdbc.driver.OracleDriver驱动不支持oracle8.17(具体版本号记不清了)及更高的版本的类型转换!
    到oracle网站去下载ojdbc.jar文件用它的驱动。
    便解决了类型转换异常!!!
    谢谢上面的朋友的大力支持!
    现在就给你们散分!!!