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가 좋아하지 않는 것은 무엇을하고있는 것입니까?
미리 감사드립니다.
그래, 잘됐다. RAWTOHEX와 HEXTORAW를 문제없이 준비된 문장에 사용했습니다. IDCOLUMN = HEXTORAW ('HEXSTRING') 인 TABLENAME에서 TABLENAME SELECT RAWTOHEX (IDCOLUMN), FIRST_NAME에서 FIRST_NAME을 (를) RAWTOHEX (IDCOLUMN)을 선택하십시오. –