Вопрос по java – Столбцы идентификаторов Oracle RAW и JDBC

0

Я пытаюсь разработать простой Java-сервлет, который вызывает базу данных Oracle 11g XE. База данных, которую мне предоставили, использует типы столбцов RAW для идентификаторов во всех таблицах.

Первоначально я пытался вернуть данные из JDBC, и base64 кодировал массивы байтов VARBINARY, которые были возвращены, чтобы я мог передать результаты через JSON во внешнюю систему. Однако после декодирования base64 и попытки вернуть байтовый массив обратно в столбец Oracle / JDBC не возвращал данные.

Я решил попробовать Oracle сделать кодирование / декодирование и смог запустить следующие запросы в Oracle, используя SQL Developer 2.

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 не нравится?

Заранее спасибо.

Ваш Ответ

2   ответа
2

Да, это работало отлично. Я использовал RAWTOHEX и HEXTORAW в подготовленных заявлениях без проблем. ВЫБЕРИТЕ RAWTOHEX (IDCOLUMN), FIRST_NAME ОТ TABLENAME ВЫБЕРИТЕ RAWTOHEX (IDCOLUMN), FIRST_NAME ОТ TABLENAME ГДЕ IDCOLUMN = HEXTORAW (& amp; HEXSTRING & apos;) Brad M
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);
        }

Также я хочу сказать, что Том Кайт не рекомендует использовать RAW Type.

Вы можете попробовать использовать разные драйверы jdbc. Я использую ojdbc14.jar, возможно, он будет хорошо работать с Oracle XE. Или может быть другой.
Я согласен, что RAW-идентификаторы не кажутся хорошей идеей, поскольку база данных взята из другой системы, с которой мы должны интегрироваться, но приятно знать, что я не сошел с ума от этой мысли. Brad M

Похожие вопросы