반응형
/**
CLOB 자료를 오라클 DB에 넣기 위한 자바 소스 파일
1. CLOB 자료형인 column을 오라클의 empty_clob()을 이용해 초기화를 해야 한다.
: 또는 CLOB column의 기본값을 empty_clob()으로 하던가..
2. setAutoCommit(false)를 꼭 해야 한다.
3. select clob_column from table where pk = value for update
: for update를 이용해 CLOB column을 lock한다.
: stream을 이용해 CLOB column을 업데이트 하는동안 다른 process의 접근을 막는다.
: 또한 stream을 이용해 자료를 넣기 전까지는 실제로 commit되지 말아야 하기 때문에
2번의 auto commit을 false로 했던 것이다. (이것때문에 하루 보냄 ㅜㅜ;;)
: 모두 쓰고 나서는 commit() <-- 옵션
: setAutoCommit(true) <-- 옵션
4. 여기서 특이한 점은 오라클의 jdbc 드라이버의 OracleResultSet과 CLOB을 이용한다는 것이다.
: java.sql.ResultSet과 java.sql.Clob을 이용하면 오라클 JDBC 드라이버가 해석시에 에러를 발생시킨다.
: 아마도 오라클 jdbc 드라이버의 문제점이 아닐까 하는 생각이 든다.
: 아니면 표준과 싸우는 오라클인가? ㅡㅡ;;
5. 나머지 부분은 Stream을 이용한 input과 output이므로 언급을 생략하겠다.
*/
import java.io.*;
import java.net.*;
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;
public class ClobTest {
public static void main(String[] argv) {
String drv = "oracle.jdbc.driver.OracleDriver";
String dburl = "jdbc:oracle:thin:@192.168.3.30:1521:GRDB21";
String user = "scott";
String password = "tiger";
Connection conn = null;
Statement st;
ResultSet rs;
try {
Class.forName(drv);
System.out.println("Drive Loading...");
conn = DriverManager.getConnection(dburl, user, password);
System.out.println("Connecting...");
st = conn.createStatement();
// 입력할 텍스트 만들기
StringBuffer sb = new StringBuffer();
String clobTest = "한글 테스트입니다\nIt is difficult\n";
for (int i = 0; i < 300; i++)
sb.append(clobTest);
// 1. CLOB 데이터 입력하기 위해, empty_clob() 생성
try {
st.executeUpdate("insert into test_clob values ('02', empty_clob())");
} catch (Exception ee) {
ee.printStackTrace(System.out);
}
// 2. setAutoCommit을 false로 꼭 해야 한다.
conn.setAutoCommit(false);
// 3. CLOB column에 대한 lock을 얻는다.
rs = st.executeQuery("select desc2 from test_clob where code = '02' for update");
if (rs. next()) {
// 4. 오라클의 함수들을 사용하기 위해 cast 하였다.
CLOB cl = ((OracleResultSet)rs).getCLOB("desc2");
// 스트림을 이용한 값 저장
BufferedWriter writer = new BufferedWriter(cl.getCharacterOutputStream());
writer.write(sb.toString());
writer.close();
}
conn.commit();
conn.setAutoCommit(true);
// 입력한 값 읽어 오기
rs = st.executeQuery("select * from test_clob where code = '02'");
if (rs.next()) {
String code = rs.getString("code");
// CLOB column에 대한 스트림을 얻는다.
Reader rd = rs.getCharacterStream("desc2");
sb = new StringBuffer();
char[] buf = new char[1024];
int readcnt;
while ((readcnt = rd.read(buf, 0, 1024)) != -1) {
// 스트림으로부터 읽어서 스트링 버퍼에 넣는다.
sb.append(buf, 0, readcnt);
}
rd.close();
System.out.println("code : " + code);
System.out.println("desc2 : " + sb.toString());
}
}
catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
출처 : http://djnine.tistory.com/
반응형
'Language > JAVA' 카테고리의 다른 글
다수의 JAR파일들 중, 특정 Class 찾기 (0) | 2010.01.11 |
---|---|
Java를 이용한 CLOB, BLOB 조작법J (0) | 2009.12.23 |
JAVA Decompiler (이클립스에 추가하기) (0) | 2009.07.02 |
프로그램 자동 들여쓰기 지원 프로그램 (0) | 2009.03.06 |
package와 import 차이 (0) | 2009.03.06 |