Oracle RAW-ID-Spalten und JDBC
Ich versuche, ein einfaches Java-Servlet zu entwickeln, das eine Oracle 11g XE-Datenbank aufruft. Die bereitgestellte Datenbank verwendet RAW-Spaltentypen für die IDs aller Tabellen.
Anfangs habe ich versucht, die Daten einfach von JDBC zurückzugewinnen und base64 verschlüsselt die zurückgegebenen VARBINARY-Bytearrays, damit ich die Ergebnisse über JSON an das Front-End-System weitergeben kann. Nach der Base64-Dekodierung und dem Versuch, das Byte-Array auf die Spalte zurückzusetzen, gab Oracle / JDBC jedoch keine Daten zurück.
Ich habe beschlossen, Oracle die Codierung / Decodierung durchführen zu lassen, und konnte mit SQL Developer 2 die folgenden Abfragen in Oracle auslösen.
<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>
Wenn Sie diese Warteschlangen jedoch mit JDBC ausführen, gilt Folgendes:
<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>
Ich erhalte folgenden Fehler:
<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>
Frage: Wie gehe ich am besten mit den RAW-ID-Spaltenbyte-Arrays um, wenn ich diese clientseitig weitergeben muss? Was mache ich falsch, wenn ich Oracle die Konvertierung durchführen lasse, die JDBC nicht mag?
Danke im Voraus.