Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle原始id列和JDBC_Java_Oracle_Jdbc - Fatal编程技术网

Java Oracle原始id列和JDBC

Java Oracle原始id列和JDBC,java,oracle,jdbc,Java,Oracle,Jdbc,我正试图开发一个简单的Javaservlet来调用Oracle11gXe数据库。我所提供的数据库对所有表上的ID使用原始列类型 最初,我试图从JDBC获取数据,并对返回的VARBINARY字节数组进行base64编码,以便通过JSON将结果传递给前端系统。但是,在base64解码并尝试将字节数组设置回列之后,Oracle/JDBC没有返回数据 我决定尝试让Oracle进行编码/解码,并能够使用SQL Developer 2在Oracle中启动以下查询 SELECT utl_encode.base

我正试图开发一个简单的Javaservlet来调用Oracle11gXe数据库。我所提供的数据库对所有表上的ID使用原始列类型

最初,我试图从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)
问题:当我必须在客户端传递原始ID列字节数组时,处理这些数组的最佳方法是什么?如果让Oracle进行转换,我做错了什么,JDBC不喜欢


提前感谢。

我有Oracle Database 10g Enterprise Edition 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);
        }

我也想说,汤姆·凯特不建议使用原始类型

尝试使用RAWTOHEX和HEXTORAW。

我同意原始id似乎不是一个好主意,虽然数据库来自另一个我们必须集成的系统,但很高兴知道我没有对这个想法发狂。你可以尝试使用不同的jdbc驱动程序。我使用ojdbc14.jar,也许它可以很好地与oraclexe配合使用。或者可能是另一个。是的,效果很好。我在准备好的声明中使用了RAWTOHEX和HEXTORAW,没有任何问题。选择RAWTOHEX(IDCOLUMN),表名中的FIRST_NAME选择RAWTOHEX(IDCOLUMN),表名中的FIRST_NAME,其中IDCOLUMN=HEXTORAW('hextstring'))