Programming/Java

Oracle Procedure로 LOB 넘기기.

Figo Kim 2009. 6. 1. 17:05
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이거 해결할려고 구글일 무지막지하게 했다.

기존에 프로시져에 스트림 방식으로 저장을 하게 되면 장문 입력이 안되는 문제가 있기 때문이다.

 private static CLOB getCLOB( String clobData, Connection conn ) throws Exception
 {
  CLOB tempClob = null;
  try
  {
   //  create a new temporary CLOB
   System.out.println("Get Temporary LOB data1");
   tempClob = CLOB.createTemporary( conn, true, CLOB.DURATION_SESSION );
   System.out.println("Get Temporary LOB data2");
   // Open the temporary CLOB in readwrite mode
   tempClob.open( CLOB.MODE_READWRITE );
   // Get the output stream to write
   Writer tempClobWriter = tempClob.getCharacterOutputStream( );
   // Write the data into the temporary CLOB
   tempClobWriter.write( clobData );
   // Flush and close the stream
   tempClobWriter.flush();
   tempClobWriter.close();
   // Close the temporary CLOB
   tempClob.close(  );
  }
  catch ( Exception exp )
  {
   exp.getMessage();
   tempClob.freeTemporary();
  } 
  return tempClob;
 }

문제는 위와 같이 할 때, 커넥션을 넘기는 부분이다. JNDI 방식으로 맺은 커넥션으로 할 경우 CLOB.createTemporary(~~~) 에서 임시 LOB을 얻지를 못한다.

String dbUrl = "jdbc:oracle:thin:@192.168.1.3:1521:ora8";
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(dbUrl, "userid","password");

해답은 위와 같이 직접 오라클 커넥션 드라이버를 로딩 한 후, 그 Connection을 넘겨야 하는 것이다.

물론 이렇게 넘겨지 LOB 데이터는 Procedure 에서 Insert 하는 방법은 많이들 알고 있는 EMPTY_CLOB() (본인은 CLOB 이었다..) 방식으로 하면 된다. 다른 방법도 있지만,,,(DBMS_LOB 패키지 사용) 본인은 귀찮아서 가장 간단한 방법(?)을 사용했다.

그렇다면 왜 저 방법을 써야 하는걸까??? 그 방법을 다시 Googling 해야 것다. 혹시 아시는 분은 댓글을 달아 주시는 센스..~~~