Ошибка запроса DB2 при извлечении поля CLOB

Из Java я делаю следующий запрос в DB2:

SELECT * FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

Поле TRANSACTION_ID представляет собой VARCHAR длины 32. Я устанавливаю параметр в подготовленном заявлении с помощью метода 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 или их комбинации". Но я не использую никаких странных функций.

Я попытался использовать sq-клиент для запроса:

SELECT * FROM PRV_PRE_ACTIVATION where transaction_id='A'

И идет нормально.

В чем причина проблемы?

ОБНОВЛЕНИЕ: код, в котором подготовлен оператор:

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

person Vitaly Olegovitch    schedule 02.10.2012    source источник
comment
можете ли вы показать код, в котором вы инициализируете подготовленный статемент   -  person user1406062    schedule 02.10.2012
comment
@HussainAl-Mutawa Я добавил этот код   -  person Vitaly Olegovitch    schedule 02.10.2012
comment
Можете ли вы выполнить SELECT * FROM PRV_PRE_ACTIVATION из своего кода Java? Ваша проблема может быть связана с проблемой соединения, а не с проблемой SQL.   -  person Gilbert Le Blanc    schedule 02.10.2012
comment
@GilbertLeBlanc да, я выполняю много других запросов к тому же источнику данных   -  person Vitaly Olegovitch    schedule 02.10.2012


Ответы (2)


Попробуйте перейти к указанному списку столбцов в списке выбора - я предполагаю, что у вас есть определенный пользователем тип столбца (или какой-либо другой тип), который не поддерживается вашим драйвером. Например, утверждение

SELECT TRANSACTION_ID FROM PRV_PRE_ACTIVATION WHERE TRANSACTION_ID = ?

работай? Если да, то начните добавлять столбцы, и вы найдете проблемный столбец.

person Hogan    schedule 02.10.2012
comment
Спасибо! Запрос, который вы написали, работает. Я заметил, что одно из полей является CLOB. Я считаю, что это проблема. - person Vitaly Olegovitch; 02.10.2012
comment
Да, CLOB не поддерживается в качестве элемента списка выбора. - person Hogan; 02.10.2012

Недавно я столкнулся с этой проблемой, и после некоторого поиска в Интернете я наткнулся на эту ссылку: Ошибка SQL DB2: SQLCODE: -270, SQLSTATE: 42997, SQLERRMC: 63, которая указывает следующее:

Столбец с типом LOB, отдельным типом в типе LOB или структурированным типом не может быть указан в списке выбора нечувствительного прокручиваемого курсора.

С помощью коллеги мы пришли к такому выводу:

1, Q: Когда вы получите это исключение "SQLCODE=-204, SQLSTATE=42704"?

О: Когда подготовлен и выполняется прокручиваемый 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(). Дополнительные сведения см. в документе по API Java. Информация.

person mec_test_1    schedule 05.02.2015
comment
Это более подробный ответ, чем принятый, плюс он предлагает лучшее решение. - person vefthym; 27.03.2019