【问题标题】:DB2 query error during the retrieval of a CLOB field检索 CLOB 字段期间的 DB2 查询错误
【发布时间】:2012-09-23 02:27:31
【问题描述】:

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

SELECT * FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

字段TRANSACTION_ID是一个长度为32的VARCHAR。我使用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);

【问题讨论】:

  • 你能显示你初始化preparedStatement的代码吗
  • @HussainAl-Mutawa 我添加了那个代码
  • 你能从你的Java代码中执行“SELECT * FROM PRV_PRE_ACTIVATION”吗?您的问题可能是连接问题,而不是 SQL 问题。
  • @GilbertLeBlanc 是的,我在同一个数据源上执行了许多其他查询

标签: sql database jdbc db2 clob


【解决方案1】:

我最近遇到了这个问题,在网上搜索了一些之后,我发现了这个链接: 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 doc了解更多信息。

【讨论】:

  • 这是一个比公认的更详细的答案,而且它提供了更好的解决方案。
【解决方案2】:

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

SELECT TRANSACTION_ID FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

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

【讨论】:

  • 谢谢!您编写的查询有效。我注意到其中一个字段是 CLOB。我相信这就是问题。
  • 是的,不支持将 CLOB 作为选择列表项。
猜你喜欢
  • 2012-09-25
  • 2019-10-30
  • 2017-04-07
  • 2018-05-31
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2014-06-15
  • 2018-07-13
相关资源
最近更新 更多