2009-03-24 20 views
1

I次のクエリ(列ログはCLOB型である)を持つ:結合CLOBをJDBC経由でSQL文を実行し

UPDATE table SET log=? where id=? 
4000文字を超える値を入れてsetAsciiStreamメソッドを使用している場合、クエリは、上記正常に動作します

ログカラムに追加します。

UPDATE table SET log=log||?||chr(10) where id=? 

上記のクエリがこれ以上機能しないと、私は次のエラーを取得する:

java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column 
ので、私のクエリは次のようになります

しかし、その代わりに値を置き換えるので、私はそれを追加したいです、

答えて

2

PL/SQLブロックを使用する必要があるように見えます。 id 1のエントリがあると仮定すると、次のように動作します。

import oracle.jdbc.OracleDriver; 
import java.sql.*; 
import java.io.ByteArrayInputStream; 

public class JDBCTest { 

    // How much test data to generate. 
    public static final int SIZE = 8192; 

    public static void main(String[] args) throws Exception { 

     // Generate some test data. 
     byte[] data = new byte[SIZE]; 
     for (int i = 0; i < SIZE; ++i) { 
      data[i] = (byte) (64 + (i % 32)); 
     } 

     ByteArrayInputStream stream = new ByteArrayInputStream(data); 

     DriverManager.registerDriver(new OracleDriver()); 
     Connection c = DriverManager.getConnection(
      "jdbc:oracle:thin:@some_database", "user", "password"); 

     String sql = 
      "DECLARE\n" + 
      " l_line CLOB;\n" + 
      "BEGIN\n" + 
      " l_line := ?;\n" + 
      " UPDATE table SET log = log || l_line || CHR(10) WHERE id = ?;\n" + 
      "END;\n"; 

     PreparedStatement stmt = c.prepareStatement(sql); 
     stmt.setAsciiStream(1, stream, SIZE); 
     stmt.setInt(2, 1); 
     stmt.execute(); 
     stmt.close(); 

     c.commit(); 

     c.close(); 
    } 
} 
2

BLOBはSQLから変更できません(NULLに設定する以外にも)ので、追加するには最初にBLOBをダウンロードし、ローカルに連結して結果を再度アップロードする必要があります。

一般的な解決策は、データベースに行を順序付けする方法を伝えるシーケンスと共通キーを使用して、複数のレコードをデータベースに書き込むことです。

関連する問題