DB2 V10 zOS JDBC получает SQLCODE -302

Я пытаюсь выполнить запрос к z/OS DB2, используя соединение JDBC Type 4. Запрос упрощается:

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

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

If I chnage the Query to

"SELECT * FROM EMP WHERE ? = '   ' OR NAME = ?"
it runs without error but that is not what I'm looking for.
Is there maybe a JDBC property which makes the expression ?=' ' universal for any length of the parameter?


person user2740037    schedule 02.09.2013    source источник


Ответы (1)


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

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

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

person mustaccio    schedule 02.09.2013
comment
Спасибо за ваш ответ. Это в основном работает, но я все еще не свободен от изменения типа данных столбца, например, с CHAR(10) на CHAR(20) без изменения всех программ, использующих столбец таким образом. - person user2740037; 03.09.2013
comment
Во-первых, если вы вынуждены изменить типы данных столбцов в существующей базе данных, значит, что-то не так с вашим подходом к проектированию. Во-вторых, ничто не мешает вам привести маркер параметра к типу данных, который покрывает ваши будущие упражнения DDL, например. ВАРЧАР(32672). - person mustaccio; 03.09.2013