2013-06-14 2 views
0

Я пытаюсь выполнить два оператора DML в DB2 с использованием JDBC, и я получаю ошибку синтаксиса:Выполнить два оператора DML в DB2 с использованием JDBC

ALTER TABLE "TEST" ALTER COLUMN "COL1" SET DATA TYPE INT; 
ALTER TABLE "TEST" ALTER COLUMN "COL1" SET NOT NULL; 

Если я исполняю их один на один все в порядке.

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

Исключением является следующее:

Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=; 
ALTER TABLE "TEST";1" SET DATA TYPE INT;<space>, DRIVER=3.65.77 

Кто-нибудь знает, что может быть проблема?

ответ

0

Очевидно, что метод execute() принимает только один оператор, а не несколько операторов, ограниченных тем, что вы можете попробовать. В документации API четко указано: «Выполняет задание SQL».

Вы можете обернуть несколько операторов в (одинарный) составного оператора:

begin execute immediate 'alter ...'; execute immediate 'alter ...'; end 
+0

Это не так очевидно ... MySQL, Oracle, PostgreSQL, SQLServer и H2 позволяют. Кроме того, не совсем уверен, но я думаю, что составные операторы не могут использоваться для операторов DML. Но, несмотря на это, я уже пробовал это. – rpvilao

+0

«_MySQL, Oracle, PostgreSQL, SQLServer и H2 allow it_» - не верно. Я не собираюсь проверять все эти базы данных для вас, но пытаюсь запустить что-то вроде «altTbl.execute» («alter table test modify» (col1 int); изменить изменение теста таблицы (col1 not null enable) »);' на База данных Oracle вызовет «ORA-00911: недопустимый символ». – mustaccio

+0

Для DB2 он должен быть скомпилированным (не указанным, указанным оператором 'ATOMIC'), а операторы DDL должны выполняться динамически через' EXECUTE IMMEDIATE'. Я соответствующим образом изменил ответ. Этот подход также будет работать в базе данных Oracle. – mustaccio

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

  • Нет связанных вопросов^_^