XMLCAST и XMLQUERY Oracle XMLDB несовместимы с iBatis?

Я пытался выбрать список значений из XML-файлов, хранящихся в столбце XMLType, но я продолжаю получать ошибки, перечисленные в конце этого поста.

Идентификатор выбора

getXMLFragment

, а соответствующее подмножество файла sqlmap.xml выглядит следующим образом:

<select id="getXMLFragment" resultClass="list">
               SELECT
                   XMLCAST(XMLQUERY('$CUSTOMER/CUSTOMER/DETAILS/
CUST_NAME/text()' PASSING CUSTOMER AS
                       "CUSTOMER" RETURNING CONTENT) AS VARCHAR2(20))
AS customers FROM SHOP.CLIENT_INFO
</select>

(CUSTOMER — это столбец XMLType в CLIENT_INFO)

и я вызываю оператор, используя

List<String> custNames= (List<String>)
sqlMap.queryForList("getXMLFragment");

Я использую ibatis-2.3.4.726.jar.

Это потому, что iBatis не распознает запросы XMLDB и, следовательно, неправильно токенизирует строку? Кстати, я реализовал XMLTypeCallback.java для успешной обработки вставок XMLType, и я думаю, что это сработает, если я захочу получить весь XML. Однако в этом случае мне нужно извлечь только отдельные значения из-за требований. Обходной путь будет принят с благодарностью.

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

Сгенерированные исключения перечислены ниже:

--- The error occurred in sqlMap.xml.
--- The error occurred while preparing the mapped statement for
execution.
--- Check the getXMLFragment.
--- Check the SQL statement.
--- Cause: java.util.NoSuchElementException
       at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:
204)
       at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForList(MappedStatement.java:
139)
       at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:
567)
       at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:
541)
       at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:
118)
       at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:
122)
       at
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:
98)
       at Main.main(Main.java:60)
Caused by: java.util.NoSuchElementException
       at java.util.StringTokenizer.nextToken(StringTokenizer.java:332)
       at
com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql.processDynamicElements(SimpleDynamicSql.java:
90)
       at
com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql.getSql(SimpleDynamicSql.java:
45)
       at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:
184)
       ... 7 more

person tth    schedule 08.06.2010    source источник
comment
Обновление: нам просто нужно повторить '$' один раз, чтобы sql был ....XMLQUERY('$$CUSTOMER..... После этого токенизация работает нормально, и запрос выполняется успешно.   -  person tth    schedule 10.06.2010


Ответы (1)


Обновление: нам просто нужно повторить '$' один раз, чтобы sql был "....XMLQUERY('$$CUSTOMER...". После этого токенизация работает нормально, и запрос выполняется успешно.

person tth    schedule 22.01.2020