2009-03-24 6 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이라는 항목이 있다고 가정하면 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를 추가 할 수 없으므로 BLOB을 먼저 다운로드하고 로컬로 연결 한 다음 결과를 다시 업로드해야합니다.

일반적인 해결책은 데이터베이스에 행을 정렬하는 방법을 알려주는 시퀀스와 공통 키를 사용하여 여러 레코드를 데이터베이스에 작성하는 것입니다.