Oracle XMLDB 的 XMLCAST 和 XMLQUERY 与 iBatis 不兼容?

发布于 2024-09-05 06:20:56 字数 2409 浏览 9 评论 0原文

我一直在尝试从存储在 XML 中的值中选择一个列表 XMLType 列,但我不断收到列在 这篇文章的结尾。

选择 id 是

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 是 CLIENT_INFO 中的 XMLType 列)

调用该语句

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

,我使用I am using 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

I've been trying to select a list of values from XMLs stored in an
XMLType column but I keep getting the errors which are listed at the
tail end of this post.

The select id is

getXMLFragment

, and the relevant subset of the
sqlmap.xml is as follows:

<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 is an XMLType column in CLIENT_INFO)

and I call the statement using

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

I am using ibatis-2.3.4.726.jar.

Is it because iBatis does not recognise XMLDB queries and hence,
tokenizes the string wrongly? On a sidenote, I have implemented
XMLTypeCallback.java to handle XMLType insertions successfully, and I
think it will work should I wish to retrieve the entire XML. However,
in this case, I need to extract only individual values due to
requirements. A workaround would be greatly appreciated.

Thanks in advance.

The exceptions generated are listed below:

--- 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟雨扶苏 2024-09-12 06:20:56

更新:我们只需要重复 '$' 一次,这样 sql 就是“....XMLQUERY('$$CUSTOMER.....” 之后标记化工作正常,并且查询成功执行。

Update: We just need to repeat '$' once such that the sql is "....XMLQUERY('$$CUSTOMER....." The tokenization works fine after that and the query executes successfully.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文