使用 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 错误?

MarkLogic 的 xQuery 中的正则表达式

xquery concat 中 & 的使用

XQuery:将日期时间与毫秒进行比较

无法解析javax.xml.xquery.XQException

Xquery 优化