使用 JDBC 的 Xquery -- 错误的 SQL 语法
Posted
技术标签:
【中文标题】使用 JDBC 的 Xquery -- 错误的 SQL 语法【英文标题】:Xquery with JDBC -- Bad SQL grammar 【发布时间】:2019-09-11 08:51:52 【问题描述】:我尝试使用 JDBC 模板执行 SQL 请求(包含 XMLQUERY 语句)。但是每次我执行请求时,DB2 都会向我发送一条错误消息,告诉我“SQL 语法错误”。而且 Xquery with JDBC 的文档也不多。
此请求旨在处理我的 DB2 数据库中的一列(包含 XML)。重要的是要补充一点,我在一家大公司工作,所以我无法下载我想要的所有依赖项,同样我对我可以使用的技术也不是免费的。 我尝试在没有 XMLQUERY 的情况下执行请求并且它工作,所以问题可能来自 Xquery 和 JDBC 之间的通信。 + 当我在我的 DB2 DB 上直接在 squirel 中执行她时,完整的请求工作。
1:SQL 请求:
String sql = "select XMLQUERY (\n" +
"'for $l in $t/Table/Ligne\n" +
"let $a0 :=$l/@CD_TYP_REJ_REJET\n" +
"where ($a0 != \"AS\")return $l'\n" +
"passing val_cttab as \"t\")\n" +
"from tptcttab\n" +
"where cd_tab_atp_cttab = 'ACTREJ';\n";
2:依赖关系:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.ibm.db2.jcc</groupId>
<artifactId>db2jcc4</artifactId>
<version>4.24.92</version>
</dependency>
</dependencies>
我希望简单地显示 XML 格式,但我收到此错误 ->
1:短日志:
Wed Sep 11 10:13:17 CEST 2019
There was an unexpected error (type=Internal Server Error, status=500).
PreparedStatementCallback; bad SQL grammar [select XMLQUERY ( 'for $l in $t/Table/Ligne let $a0 :=$l/@CD_TYP_REJ_REJET where ($a0 != "AS")return $l' passing val_cttab as "t") from tptcttab where cd_tab_atp_cttab = 'ACTREJ'; ]; nested exception is com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=;;atp_cttab = 'ACTREJ';END-OF-STATEMENT, DRIVER=4.19.49
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select XMLQUERY ( 'for $l in $t/Table/Ligne let $a0 :=$l/@CD_TYP_REJ_REJET where ($a0 != "AS")return $l' passing val_cttab as "t") from tptcttab where cd_tab_atp_cttab = 'ACTREJ'; ]; nested exception is com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=;;atp_cttab = 'ACTREJ';END-OF-STATEMENT, DRIVER=4.19.49
所以我在这里我不知道为什么它不能与 JDBC 一起使用,所以如果你有一个想法,它可以帮助我很多thanx!
【问题讨论】:
需要查看实际到达 Db2 的 SQL,因为 Db2 正在拒绝令牌;;atp_cttab = 'ACTREJ'
。为什么是双分号?要查看原始 SQL,请使用 jdbc 跟踪,或者询问您的 DBA 是否有。有关启用 jdbc 跟踪的详细信息,请参阅 Db2 文档。
【参考方案1】:
-104 是
SQL0104N An unexpected token "<token>" was found following "<text>".
Expected tokens may include: "<token-list>".
它在抱怨'ACTREJ';
,所以我认为你不需要的是你声明末尾的;
。
这当然是从 db2 clp 和 DataStudio 为我运行的
select XMLQUERY ('for $l in $t/Table/Ligne let $a0 :=$l/@CD_TYP_REJ_REJET where ($a0 != "AS")return $l' passing val_cttab as "t") from tptcttab where cd_tab_atp_cttab = 'ACTREJ'
虽然我没有从你的样本数据中得到任何价值
【讨论】:
好的,首先感谢分号是导致此 SQL 错误的原因。但现在看来passing val_cttab as \"t\")\n
产生了另一个问题。 val_cttab 在完整请求中无法识别,但是当我使用像 select val_cttab from tptcttab
这样的简单 sql 请求时,它可以正常工作。以下是新的错误行:(SQL 状态 [null];错误代码 [-4460];[jcc][10150][10300][4.19.49] 参数无效:Nom de Colonne inconnu(无效参数:未知列的名称) VAL_CTTAB.ERRORCODE=-4460, SQLSTATE=null;嵌套异常是 com.ibm.db2.jcc.am.SqlException)
@CorentinRenard 根据您的查询,您的tptcttab
表中必须有一个val_cttab
类型的列XML
。你真的有吗?如果是这样,请提供一些示例数据内容以及您希望通过查询获得的结果。
如果你有一个新的错误,你应该问一个新的 Stack Overflow 问题,在你这样做之前,试着搜索一下是否有其他人曾经问过这个问题。例如。也许这很适合你***.com/questions/15981711/… 和/或ibm.com/support/pages/…以上是关于使用 JDBC 的 Xquery -- 错误的 SQL 语法的主要内容,如果未能解决你的问题,请参考以下文章
Fulltext Xquery (Lucene/KWIC) 不适用于“标记”结果。 eXist-db 错误?