ошибка при выполнении PreparedStatement над DB2 Express-C - PullRequest
4 голосов
/ 22 февраля 2011

При выполнении запроса по объекту Statement работает нормально, но при выполнении того же запроса по объекту PreparedStatement создается исключение SQL.

Этот запрос работает нормально ...

 String query = "SELECT A, B, C, D, LOBJ FROM TABLE WHERE LOBJ = 'sGMMEMDEML2';

Statement stmt = con.createStatement()

ResultSet rs = stmt.executeQuery(query);

Этот запрос вызываетsql исключение (DB2 SQL Error: SQLCODE = -302, SQLSTATE = 22001, SQLERRMC = null) ...

String query = "SELECT A, B, C, D, LOBJ FROM TABLE WHERE LOBJ = ?;

PreparedStatement preStmt = con.prepareStatement(query);

preStmt.setString(1, 'sGMMEMDEML2');

ResultSet rs = preStmt.executeQuery();

Столбец LOBJ в представлении TABLE имеет длину 10 символов, но его указанное значение в предложении where можетили не может содержать 10 символов из-за некоторых ограничений в приложении.

Кто-нибудь может мне помочь, как это может быть выполнено с PreparedStatement.

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 20 июля 2011

Возможно, вы захотите включить совместимость DB2 с Oracle или MySQL (запустите эти команды в командной строке DB2):

db2set DB2_COMPATIBILITY_VECTOR=ORA # or MYS
db2stop
db2start

Однако обратите внимание, что это влияет только на вновь созданные базы данных (по крайней мере, некоторые *)1004 * последствия).За подробностями обращайтесь к документации DB2 (однако обратите внимание, что MYS не очень хорошо документирован, но упоминается по крайней мере в C-Express 9.7.4 примечаниях к выпуску .

1 голос
/ 22 февраля 2011

Из кодов ошибок IBM DB2:

SQLCODE = -302

THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS INVALID OR TOO LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE

Как вы уже сказали, LOBJ имеет длину 10 символов и в вашемquery

preStmt.setString(1, 'sGMMEMDEML2');

длина вашей входной строки составляет 11 символов.Так что просто проверьте его, прежде чем обращаться к базе данных.

1 голос
/ 22 февраля 2011

Попробуйте напечатать подготовленный оператор и выполнить запрос к базе данных.

0 голосов
/ 05 сентября 2014

Мы используем DB2 9.7.x, и у меня возникла та же проблема, и я обнаружил, что это происходит в связи с установкой для параметра соединения DB2 JDBC "deferPrepares" значения "false".

Если вы установите для «deferPrepares» значение «true» или пропустите параметр из строки подключения, то PreparedStatement выполняется без ошибок. Это происходит только при сравнении строковых столбцов с помощью «=» или «<>». Если вы сравните столбец по «лайку», то ошибки не будет.

Я считаю это поведение серьезной ошибкой, поскольку оно отличается от поведения, отображаемого в любом окне команд SQL.

К сожалению, мы установили для deferPrepares значение false, чтобы обойти другую проблему с логическими полями, отображаемыми Hibernate в столбцы Smallint. Эта проблема, по крайней мере, исправлена ​​в драйвере DB2 JDBC Версии 9.7 Fix Pack 8 (см. APAR № IC88582 по адресу http://www -01.ibm.com / support / docview.wss? Uid = swg21415236 ).

Поэтому я рекомендую установить для deferPrepares значение true и использовать драйверы JDBC из Fix Pack 8 или более поздней версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...