- PR -

Oracle8i + JDBCでのlong型の取り扱いで例外発生

1
投稿者投稿内容
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2003-09-09 16:44
いつもお世話になっております。

Oracle8i + JDBC(Oracle Thinドライバ)でSQLのselect文を実行すると
DBの型がlong型のカラムでのみResultSetのgetCharacterStreamで
「SQL.Exception===ストリームはすでにクローズ済です。」というSQLExceptionが発生してしまいます。
それも入っているデータが同じでも毎回出るのではなく、
時によって出たり出なかったりします。
その再現のタイミングもまだつかめていません。
下記コードのgetCharacterStreamをgetStringに変えてみても
やはり同じエラーが出てきてしまいます。
どなたか原因の心当たりはございませんでしょうか。

J2SDKのバージョンは1.3.1_06です。

コード:
Statement st = con.getStatement();
int     n    = -1;
boolean more = st.execute( sql );
do {
    if ( more ) {
        ResultSet         rs   = st.getResultSet();
        ResultSetMetaData md   = rs.getMetaData();
        int               cols = md.getColumnCount();
        if ( se != null ) {
        while( rs.next() ) {
            ResultSetMetaData md   = rs.getMetaData();

            for( int i = 1; i <= cols; i++ ) {
            String s = "";
            if ( md.getColumnType( i ) == Types.LONGVARCHAR ) {
                StringBuffer   buf    = new StringBuffer();
                BufferedReader reader = new BufferedReader( rs.getCharacterStream( i ) );
                String         temp   = null;
                while( ( temp = reader.readLine() ) != null ) {
                    buf.append( temp ).append( '\n' );
                }
                reader.close();
                s = buf.toString();
            }
        }
        more = st.getMoreResults();
} while( more );



よろしくお願いします。
未記入
会議室デビュー日: 2004/07/22
投稿数: 1
投稿日時: 2004-07-22 11:41
当方ではStatementをFORWARD_ONLYから変更したら解消しました。
yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2004-07-22 15:49
Oracleに関してはここよりも下記の掲示板の方が回答を得やすいと思います。
http://otn.oracle.co.jp/forum/index.html

全然分かりませんが、私なら
・最新のJDBC Thinドライバーを使ってみる。
 (DBサーバが8iでも JDBC Driver 9.x とか 10.x を利用可能です。)
 できれば保守契約して入手できる最新のものを使うことをお勧めします。
・OCIのドライバーを使ってみる。
 (こちらはOracle Clientが必要なので簡単に最新のものを試せませんが。)
未記入
会議室デビュー日: 2004/06/25
投稿数: 6
投稿日時: 2004-07-22 17:17
確か、Oracle8iのJDBCドライバは、LOBの扱いが独自実装です。
まずLOBロケータを取得する。次いで、ストリームを取得しなけ
ければいけなかったと思います。

:
oracle.sql.CLOB oclob = (oracle.sql.CLOB)rset.getObject(i);
InputStream is = oclob.getCharacterStream();
:
1

スキルアップ/キャリアアップ(JOB@IT)