一个CLOB字段的检索过程中DB2查询错误(DB2 query error during the r

2019-08-01 02:01发布

从Java我做对DB2以下查询:

SELECT * FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

领域TRANSACTION_IDVARCHAR长度32的我使用设置的参数在preparedStatement时setString方法。

我得到的错误:

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'

和它去确定。

有什么问题的原因是什么?

UPDATE:其中准备语句中的代码:

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

Answer 1:

尝试改变,以列的指定列表中选择列表 - 我的猜测是,你有没有被你的驱动程序支持用户自定义的字段类型(或一些其他类型)。 例如,做的声明

SELECT TRANSACTION_ID FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

工作? 如果是,则在开始添加列,你会发现这个问题列。



Answer 2:

我已经过这个问题来到最近,经过在网上一番搜索,我碰到这个链接来了: DB2 SQL错误: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,问:那么,如果我们希望在[B | C],以摆脱它有什么解决办法LOB字段查询?

答:尝试使用ResultSet.TYPE_FORWARD_ONLY在创建查询statement.eg:

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

或者干脆试试这个:

stmt = conn.createStatement();

需要注意的是,同样的规则适用于conn.prepareStatement()了。 你可以参考的Java API文档以获取更多信息。



文章来源: DB2 query error during the retrieval of a CLOB field