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アプリケーション・サーバー、またはその2つの組み合わせではサポートされていない」という意味の場合。しかし、私は奇妙な機能を使用していません。

私は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

私は最近この問題に遭遇し、ウェブで検索した後、次のリンクに遭遇しました: DB2 SQL error: SQLCODE: -270, SQLSTATE: 42997, SQLERRMC: 63 、これを指定します:

LOB タイプ、LOB タイプの特殊タイプ、または構造化タイプの列は、インセンシティブ両方向スクロール・カーソルの選択リストに指定できません。

同僚の助けを借りて、次の結論に達しました。

1, Q: この "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 に答える
2

選択リストで指定された列のリストに変更してみてください-ドライバーでサポートされていないユーザー定義の列タイプ(または他のタイプ)があると思います。たとえば、ステートメントは

SELECT TRANSACTION_ID FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

仕事?その場合は、列の追加を開始すると、問題の列が見つかります。

于 2012-10-02T13:15:38.190 に答える