Kolumny identyfikacyjne Oracle RAW i JDBC

Próbuję opracować prosty serwlet Java, który wywołuje bazę danych Oracle 11g XE. Dostarczona baza danych używa typów kolumn RAW dla identyfikatorów we wszystkich tabelach.

Początkowo próbowałem odzyskać dane z JDBC, a base64 kodował zwracane tablice bajtów VARBINARY, dzięki czemu mogłem przekazać wyniki przez JSON do systemu front-end. Jednak po dekodowaniu base64 i próbie przywrócenia tablicy bajtów z powrotem do kolumny, Oracle / JDBC nie zwracało danych.

Postanowiłem spróbować Oracle zrobić kodowanie / dekodowanie i był w stanie uzyskać następujące zapytania do ognia w Oracle przy użyciu SQL Developer 2.

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

Jednak podczas wykonywania tych kolejek za pomocą JDBC:

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

Otrzymuję następujący błąd:

<code>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)
</code>

Pytanie: Jaki jest najlepszy sposób radzenia sobie z tablicami bajtów kolumn RAW ID, gdy muszę je przekazać po stronie klienta? Jeśli pozwolę Oracle na konwersję, co robię źle, że JDBC nie lubi?

Z góry dziękuję.

questionAnswers(1)

yourAnswerToTheQuestion