Oracle RAW id列和JDBC

我正在尝试开发一个调用Oracle 11g XE数据库的简单Java servlet。 我提供的数据库使用RAW列类型作为所有表的ID。

最初我试图从JDBC获取数据,并且base64编码返回的VARBINARY字节数组,这样我就可以通过JSON将结果传递给前端系统。 但是,在base64解码并尝试将字节数组设置回列之后,Oracle / JDBC没有返回数据。

我决定尝试让Oracle进行编码/解码,并且能够使用SQL Developer 2在Oracle中获取以下查询。

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') 

但是在使用JDBC执行这些queires时:

 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) {} } 

我收到以下错误:

 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) 

问题:当我必须在客户端传递这些时,处理RAW ID列字节数组的最佳方法是什么? 如果让Oracle进行转换,我不知道JDBC不喜欢什么?

提前致谢。

尝试使用RAWTOHEX和HEXTORAW。

我有Oracle数据库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); } 

另外我想说,Tom Kyte不推荐使用RAW Type。