检索CLOB字段期间的DB2查询错误

时间:2012-10-02 08:25:20

标签: sql database jdbc db2 clob

从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);

2 个答案:

答案 0 :(得分:2)

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

SELECT TRANSACTION_ID FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

工作?如果是,则开始添加列,您将找到问题列。

答案 1 :(得分:2)

我最近遇到过这个问题,经过网上搜索后,我发现了这个链接: DB2 SQL error: SQLCODE: -270, SQLSTATE: 42997, SQLERRMC: 63 ,其中指明了这一点:

  

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

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

1,问:你什么时候能得到这个" SQLCODE = -204,SQLSTATE = 42704"异常?

答:准备好可滚动的PreparedStatement&已执行,但选择列表中存在[B | C] LOB字段。 e.g:

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,问:如果我们想在查询[B | C] LOB字段时将其删除,那么解决方案是什么?

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

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

或者只是试试这个:

stmt = conn.createStatement();

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