0

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

最初,我试图从 JDBC 中获取数据,并对返回的 VARBINARY 字节数组进行 base64 编码,这样我就可以通过 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 执行这些查询时:

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 不喜欢?

提前致谢。

4

2 回答 2

2

尝试使用 RAWTOHEX 和 HEXTORAW。

于 2012-04-09T21:35:20.317 回答
0

我有 Oracle Database 10g Enterprise Edition Release 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 类型。

于 2012-04-09T21:01:19.227 回答