以上是转贴的一个关于大数据存储的方法在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...)

解决方案 »

  1.   

    根据楼主的描述,你可能要注意oracle驱动程序不同版本之间的clob类型转换是不兼容的
      

  2.   

    //以下是oracle 中的源码,小弟照着它用了一下,成功,强制类型转换未出现问题
    //                    %oracle 目录%\jdbc\demo\samples\generic
    /* 
     * This sample demonstrate basic Lob support.
     * (insert, fetch rows of BLOB and CLOB)
     *
     * It 1. drops, create, and populates table basic_lob_table
     *       with blob, clob data types in the database.
     *    2. Please use jdk1.2 or later version and classes12.zip 
     */import java.sql.*;
    import java.io.*;
    import java.util.*;// Importing the Oracle Jdbc driver package makes
    // the code more readable
    import oracle.jdbc.*;//needed for new CLOB and BLOB classes
    import oracle.sql.*;public class LobExample
    {
      public static void main (String args [])
           throws Exception
      {
        // Register the Oracle JDBC driver
        DriverManager.registerDriver
                       (new oracle.jdbc.OracleDriver());    String url = "jdbc:oracle:oci8:@";
        try {
          String url1 = System.getProperty("JDBC_URL");
          if (url1 != null)
            url = url1;
        } catch (Exception e) {
          // If there is any security exception, ignore it
          // and use the default
        }    // Connect to the database
        Connection conn =
          DriverManager.getConnection (url, "hr", "hr");    // It's faster when auto commit is off
        conn.setAutoCommit (false);    // Create a Statement
        Statement stmt = conn.createStatement ();    try
        {
          stmt.execute ("drop table basic_lob_table");
        }
        catch (SQLException e)
        {
          // An exception could be raised here if the
          // table did not exist already.
        }    // Create a table containing a BLOB and a CLOB
        stmt.execute ("create table basic_lob_table (x varchar2 (30), " +
                      "b blob, c clob)");
        
        // Populate the table
        stmt.execute ("insert into basic_lob_table values ('one', " +
                      "'010101010101010101010101010101', " +
                      "'onetwothreefour')");
        stmt.execute ("insert into basic_lob_table values ('two', " +
                      "'0202020202020202020202020202', " +
                      "'twothreefourfivesix')");
        
        System.out.println ("Dumping lobs");    // Select the lobs. Since the Lob contents will be modified,
        // we need to lock the table rows. This can be done by doing
        // "select ... for update", but we don't need to select for
        // update here because we have "autocommit" turned off and
        // the previous "create table" statement already have the
        // whole table locked.
        ResultSet rset = stmt.executeQuery
                              ("select * from basic_lob_table");
        while (rset.next ())
        {
          // Get the lobs
          BLOB blob = ((OracleResultSet)rset).getBLOB (2);
          CLOB clob = ((OracleResultSet)rset).getCLOB (3);      // Print the lob contents
          dumpBlob (blob);
          dumpClob (clob);      // Change the lob contents
          fillClob (clob, 2000);
          fillBlob (blob, 4000);
        }    System.out.println ("Dumping lobs again");    rset = stmt.executeQuery
                    ("select * from basic_lob_table");
        while (rset.next ())
        {
          // Get the lobs
          BLOB blob = ((OracleResultSet)rset).getBLOB (2);
          CLOB clob = ((OracleResultSet)rset).getCLOB (3);      // Print the lobs contents
          dumpBlob (blob);
          dumpClob (clob);
        }
        // Close all resources
        rset.close();
        stmt.close();
        conn.close(); 
      }  // Utility function to dump Clob contents
      static void dumpClob (CLOB clob)
        throws Exception
      {
        // get character stream to retrieve clob data
        Reader instream = clob.getCharacterStream();    // create temporary buffer for read
        char[] buffer = new char[10];    // length of characters read
        int length = 0;    // fetch data  
        while ((length = instream.read(buffer)) != -1)
        {
          System.out.print("Read " + length + " chars: ");      for (int i=0; i<length; i++)
            System.out.print(buffer[i]);
          System.out.println();
        }    // Close input stream
        instream.close();
      }  // Utility function to dump Blob contents
      static void dumpBlob (BLOB blob)
        throws Exception
      {
        // Get binary output stream to retrieve blob data
        InputStream instream = blob.getBinaryStream();    // Create temporary buffer for read
        byte[] buffer = new byte[10];    // length of bytes read
        int length = 0;    // Fetch data  
        while ((length = instream.read(buffer)) != -1)
        {
          System.out.print("Read " + length + " bytes: ");      for (int i=0; i<length; i++)
            System.out.print(buffer[i]+" ");
          System.out.println();
        }    // Close input stream
        instream.close();
      }  // Utility function to put data in a Clob
      static void fillClob (CLOB clob, long length)
        throws Exception
      {
        Writer outstream = clob.getCharacterOutputStream();    int i = 0;
        int chunk = 10;    while (i < length)
        {
          outstream.write(i + "hello world", 0, chunk);      i += chunk;
          if (length - i < chunk)
    chunk = (int) length - i;
        }
        outstream.close();
      }  // Utility function to put data in a Blob
      static void fillBlob (BLOB blob, long length)
        throws Exception
      {
        OutputStream outstream =
                     blob.getBinaryOutputStream();    int i = 0;
        int chunk = 10;    byte [] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    while (i < length)
        {
          data [0] = (byte)i;
          outstream.write(data, 0, chunk);      i += chunk;
          if (length - i < chunk)
    chunk = (int) length - i;
        }
        outstream.close();
      }
    }
      

  3.   

    现在看来问题出在连接数据库的方法上面。如果用tomcat 的连接池则在强类型转换过程中出错。如用老的
    DriverManager则没有问题