Syntax 使用JDBC在DB2中执行两个DML语句

Syntax 使用JDBC在DB2中执行两个DML语句,syntax,db2,alter-table,dml,Syntax,Db2,Alter Table,Dml,我试图使用JDBC在DB2中执行两条DML语句,但始终出现语法错误: ALTER TABLE "TEST" ALTER COLUMN "COL1" SET DATA TYPE INT; ALTER TABLE "TEST" ALTER COLUMN "COL1" SET NOT NULL; 如果我一个接一个地执行,一切都没问题 我尝试过不使用分号,在第一个语句中只使用一个分号。我还尝试了几个\r\n,但我真的不明白问题出在哪里 例外情况如下: Caused by: com.ibm.db2.jc

我试图使用JDBC在DB2中执行两条DML语句,但始终出现语法错误:

ALTER TABLE "TEST" ALTER COLUMN "COL1" SET DATA TYPE INT;
ALTER TABLE "TEST" ALTER COLUMN "COL1" SET NOT NULL;
如果我一个接一个地执行,一切都没问题

我尝试过不使用分号,在第一个语句中只使用一个分号。我还尝试了几个\r\n,但我真的不明白问题出在哪里

例外情况如下:

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
原因:com.ibm.db2.jcc.am.SqlSyntaxErrorException:db2sql错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=;
更改表格“测试”;1“设置数据类型INT;,驱动程序=3.65.77
有人知道可能是什么问题吗?

显然,execute()方法只接受一条语句,而不接受由您尝试的语句分隔的多条语句。API文档中明确说明了这一点:“执行给定的SQL语句”

您可以将多个语句包装成一个(单个)复合语句:

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

这并不是很明显……MySQL、Oracle、PostgreSQL、SQLServer和H2允许这样做。另外,我也不太确定,但我认为复合语句不能用于DML语句。但即使如此,我已经尝试过了。“MySQL、Oracle、PostgreSQL、SQLServer和H2允许这样做。””“不对。我不打算为您测试所有这些数据库,而是尝试运行类似于
altTbl.execute(“altertable test modify(col1 int);alter table test modify(col1 not null enable)”将导致
ORA-00911:无效字符
。对于DB2,它必须是一个已编译(非内联,由
原子
关键字指示)语句,并且DDL语句必须通过
立即执行
动态执行。我相应地修改了答案。这种方法也适用于Oracle数据库。