Сделайте вставку DB2 с выбором и параметрами - PullRequest
10 голосов
/ 01 сентября 2010

Я хочу сделать что-то вроде этого:

INSERT INTO TABLEA
(
 COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, ?
FROM TABLEB

А затем отправьте это в JDBC через Spring JDBC для обновления ...

simpleJdbcTemplate.update( mySqlFromAbove, someVariableToReplaceQuestionMark );

Это вообще возможно? Было бы хорошо работать, если я заменил знак вопроса жестко закодированным значением при построении моего запроса SQL, но я не хочу открывать себя для инъекции SQL ...

Редактировать -
Я получаю
вложенное исключение: com.ibm.db2.jcc.c.SqlException: ошибка SQL DB2: SQLCODE: -418, SQLSTATE: 42610, SQLERRMC: ноль
Что, кажется, указывает на
Неправильное использование маркера параметра?

Ответы [ 4 ]

12 голосов
/ 02 сентября 2010

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

Например:

INSERT INTO TABLEA
(
 COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, cast(? as int)
FROM TABLEB

Очевидно, приведение к соответствующему типу - int просто пример.

2 голосов
/ 02 сентября 2010

Вот справочник по сообщениям SQL DB2 .Вот выдержка из релевантности для SQLCODE и SQLSTATE, которые вы получили:

SQL0418N

В операторе содержится недопустимый маркер параметра.

Объяснение:

Нельзя использовать маркеры нетипизированных параметров:

  • в списке SELECT
  • в качестве единственного аргумента арифметической операции datetime
  • в некоторыхслучаи в качестве единственного аргумента скалярной функции
  • в качестве ключа сортировки в предложении ORDER BY

Никогда нельзя использовать маркеры параметров:

  • inоператор, который не является подготовленным оператором
  • в полной выборке оператора CREATE VIEW
  • в инициированном действии оператора CREATE TRIGGER
  • в запросе, захваченном DB2 QueryPatroller

Оператор не может быть обработан.

Действия пользователя:

Исправьте синтаксис оператора.Если нетипизированные маркеры параметров недопустимы, используйте спецификацию CAST, чтобы задать для маркера параметров тип данных.

sqlcode: -418

sqlstate: 42610

К сожалению,это не решает вашу проблему, так как ваш SQL выглядит нормально.После Googling немного больше похоже, что драйвер DB2 JDBC просто не принимает INSERT INTO ... SELECT ... операторов в PreparedStatement.Неясно, отсутствует ли это в Справочнике по сообщениям SQL или в драйвере JDBC.

1 голос
/ 03 декабря 2014

Мы получили ту же ошибку, и мы исправили проблему, переработав сервер. Если есть сомнения, перезагрузите компьютер.

1 голос
/ 01 сентября 2010

Должно работать нормально.И +1 за «без внедрения SQL».

Делитесь и наслаждайтесь.

...