2

在 Java 中,我在 DB2 上执行以下查询:

SELECT * FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

该字段TRANSACTION_IDVARCHAR长度为32。我使用该setString方法在preparedStatement中设置了参数。

我得到错误:

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.59.81
    at com.ibm.db2.jcc.am.dd.a(dd.java:676)
    at com.ibm.db2.jcc.am.dd.a(dd.java:60)
    at com.ibm.db2.jcc.am.dd.a(dd.java:127)
    at com.ibm.db2.jcc.am.bn.c(bn.java:2546)
    at com.ibm.db2.jcc.am.bn.d(bn.java:2534)
    at com.ibm.db2.jcc.am.bn.a(bn.java:2026)
    at com.ibm.db2.jcc.t4.cb.g(cb.java:140)
    at com.ibm.db2.jcc.t4.cb.a(cb.java:40)
    at com.ibm.db2.jcc.t4.q.a(q.java:32)
    at com.ibm.db2.jcc.t4.rb.i(rb.java:135)
    at com.ibm.db2.jcc.am.bn.gb(bn.java:1997)
    at com.ibm.db2.jcc.am.cn.pc(cn.java:3009)
    at com.ibm.db2.jcc.am.cn.b(cn.java:3786)
    at com.ibm.db2.jcc.am.cn.bc(cn.java:678)
    at com.ibm.db2.jcc.am.cn.executeQuery(cn.java:652)

其中 sqstate 表示“此版本的 DB2 应用程序请求者、DB2 应用程序服务器或两者的组合不支持功能”。但我不使用任何奇怪的功能。

我尝试使用 squ 客户端查询:

SELECT * FROM PRV_PRE_ACTIVATION where transaction_id='A'

一切顺利。

问题的原因是什么?

更新:准备语句的代码:

s = con.prepareStatement(sSQL,
                 ResultSet.TYPE_SCROLL_INSENSITIVE,
                 ResultSet.CONCUR_UPDATABLE);
4

2 回答 2

2

尝试更改为选择列表中的指定列列表——我猜你有一个用户定义的列类型(或其他类型),驱动程序不支持。例如,是否声明

SELECT TRANSACTION_ID FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

工作?如果是这样,那么开始添加列,您将找到问题列。

于 2012-10-02T13:15:38.190 回答
2

我最近遇到了这个问题,在网上搜索了一些之后,我发现了这个链接: DB2 SQL error: SQLCODE: -270, SQLSTATE: 42997, SQLERRMC: 63 ,它指定了这个:

不能在不敏感可滚动游标的选择列表中指定具有 LOB 类型、LOB 类型上的不同类型或结构化类型的列。

在同事的帮助下,我们得出了这样的结论:

1、问:什么时候会得到这个“SQLCODE=-204, SQLSTATE=42704”的异常?

A:当一个可滚动的 PreparedStatement 准备和执行时,选择列表中存在 [B|C]LOB 字段。例如:

String strQuery = "SELECT NUMBER_FIELD, CHAR_FIELD, CLOB_FIELD FROM TABLE_NAME WHERE CONDITION IS TRUE;"
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, REsultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(strQuery); //and this exception will be thrown here

2、Q:那么在查询[B|C]LOB字段的时候,如果想去掉,有什么办法呢?

A:在创建查询语句时尝试使用 ResultSet.TYPE_FORWARD_ONLY。例如:

stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);

或者干脆试试这个:

stmt = conn.createStatement();

请注意,相同的规则也适用于 conn.prepareStatement()。您可以参考Java API 文档了解更多信息。

于 2015-02-05T01:17:25.317 回答