2013-09-02 2 views
0

Я пытаюсь выполнить запрос против z/OS DB2, используя JDBC Type 4 Connection. Запрос упрощается:DB2 V10 zOS JDBC Получение SQLCODE -302

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM EMP WHERE ? = ' ' OR NAME = ?"); 
    stmt.setString(1, "Joe"); 
    stmt.setString(2, "Joe"); 

Выполнение этого запроса приведет к SQLCODE -302, потому что это Joe длина три и одна заготовка длиной один.

Если я выполняю запрос до

"SELECT * FROM EMP WHERE ? = ' ' OR NAME = ?"
, он работает без ошибок, но это не то, что я ищу.
Возможно ли, что свойство JDBC делает выражение ?=' ' универсальным для любой длины параметра?

ответ

0

Поскольку в марке голых параметров нет информации о точном типе данных или точности параметра, сервер DB2 использует правую часть выражения для его определения. Можно использовать явное приведение типов, чтобы предоставить необходимую информацию для компилятора запросов:

SELECT * FROM EMP WHERE cast(? as varchar(10)) = ' ' OR NAME = ?" 

Заменить varchar(10) с фактическим типом данных EMP.NAME.

+0

Спасибо за ваш ответ. Это в основном работает, но я по-прежнему не свободен от изменения типа данных столбца, например, от «CHAR (10)» до «CHAR (20)», не меняя при этом все программы с использованием столбца. – user2740037

+0

Во-первых, если вы вынуждены изменять типы данных столбцов в существующей базе данных, что-то не так с вашим дизайнерским подходом. Во-вторых, ничто не мешает вам использовать маркер параметра для типа данных, который охватывает ваши будущие упражнения DDL, например. УАКСНАК (32672). – mustaccio

Смежные вопросы