2012-04-09 4 views
0

Oracle 11g XE 데이터베이스를 호출하는 간단한 Java 서블릿을 개발하려고합니다. 필자가 제공 한 데이터베이스는 모든 테이블의 ID에 RAW 열 유형을 사용합니다.Oracle RAW id 열과 JDBC

처음에는 JDBC에서 데이터를 다시 가져 오려고 시도했으며 base64가 반환되는 VARBINARY 바이트 배열을 인코딩하므로 JSON을 통해 프런트 엔드 시스템에 결과를 전달할 수있었습니다. 그러나 base64 디코딩 후 바이트 배열을 다시 열로 설정하려고하면 Oracle/JDBC가 데이터를 반환하지 않습니다.

내가 인코딩/디코딩을 시도하고 오라클을하기로 결정하고 JDBC를 사용하여 이러한 queires을 실행할 때 2.

SELECT utl_encode.base64_encode(IDCOLUMN), FIRST_NAME FROM TABLENAME 
SELECT utl_encode.base64_encode(IDCOLUMN), FIRST_NAME FROM TABLENAME WHERE IDCOLUMN = utl_encode.base64_decode('BASE64STRING') 

그러나 SQL 개발자를 사용하여 Oracle에서 화재로 다음과 같은 쿼리를 얻을 수있었습니다 :

java.sql.SQLException: ORA-29261: bad argument 
ORA-06512: at "SYS.UTL_ENCODE", line 8 
ORA-06512: at "SYS.UTL_ENCODE", line 243 

oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) 
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) 
oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) 
oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450) 
oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) 
oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 
oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193) 
oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:866) 
oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167) 
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289) 
oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1491) 
oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:406) 
com.pearson.familyportal.servlet.WebController.doPost(WebController.java:97) 
com.pearson.familyportal.servlet.WebController.doGet(WebController.java:171) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

질문 :

conn = isConnSupplied ? userConn : ResourceManager.getConnection(); 
Statement stmt = conn.createStatement(); 
try { 
    ResultSet rset = stmt.executeQuery("SELECT utl_encode.base64_encode(IDCOLUMN), FIRST_NAME FROM TABLENAME"); 
    try { 
    while (rset.next()) 
     System.out.println (rset.getString(1)); // Print col 1 
    } 
    finally { 
     try { rset.close(); } catch (Exception ignore) {} 
    } 
} 
finally { 
    try { stmt.close(); } catch (Exception ignore) {} 
} 

나는 다음과 같은 오류가 무엇가있다 가장 좋은 방법은 RAW ID 열 바이트 배열을 처리 할 때 클라이언트 측에서 이들을 전달해야합니까? 오라클이 변환을 수행하게한다면, JDBC가 좋아하지 않는 것은 무엇을하고있는 것입니까?

미리 감사드립니다.

답변

2

RAWTOHEX 및 HEXTORAW를 사용해보세요.

+0

그래, 잘됐다. RAWTOHEX와 HEXTORAW를 문제없이 준비된 문장에 사용했습니다. IDCOLUMN = HEXTORAW ('HEXSTRING') 인 TABLENAME에서 TABLENAME SELECT RAWTOHEX (IDCOLUMN), FIRST_NAME에서 FIRST_NAME을 (를) RAWTOHEX (IDCOLUMN)을 선택하십시오. –

0

나는 톰 카이트 사용 RAW 형식을 권장하지 않습니다, 오라클 데이터베이스 10g 엔터프라이즈 에디션 출시 10.2.0.1.0 및 Java 1.6,

Statement stmt = conn.createStatement(); 
     ResultSet rset = stmt.executeQuery("SELECT utl_encode.base64_encode(ID), NAME FROM raw_table"); 
     while (rset.next()) 
     { 
      Object obj = rset.getString(1); 
      logger.debug(obj); 
     } 

또한 내가 말하고 싶은 좋은 코드가 작동합니다.

+0

RAW ID가 좋은 생각처럼 보이지 않는다는 데 동의합니다. 데이터베이스는 다른 시스템에서 가져와야하지만, 그 생각에 미치지 않았다는 것을 알면 좋습니다. –

+0

다른 jdbc 드라이버를 사용해보십시오. ojdbc14.jar을 사용합니다. 아마도 Oracle XE에서 잘 작동합니다. 아니면 다른 것일 수도 있습니다. – Alexander

관련 문제