为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:linux
【CPU】:
【问题描述】*:jdbc执行多条DDL语句时报错;
在DM管理工具中可以执行成功,拆分成单条也可以执行成功;
public static void main(String[] args) {
try {
//1.加载 JDBC 驱动程序
System.out.println("Loading JDBC Driver...");
Class.forName(jdbcString);
//2.连接 DM 数据库
System.out.println("Connecting to DM Server...");
conn = DriverManager.getConnection(urlString, userName, password);
//3.通过连接对象创建 java.sql.Statement 对象
state = conn.createStatement();
//-----------------------------------------------------------------------------
//基础操作:此处对应的操作代码为示例库中 PRODUCTION 模式中的
//PRODUCT_CATEGORY 表
//增加
//定义增加的 SQL 这里由于此表中的结构为主键,自增,只需插入 name 列的值
String sql_insert = "CREATE TABLE accessor
(\n" +
"id
int AUTO_INCREMENT NOT NULL,\n" +
"user_id
varchar(32) NOT NULL,\n" +
"user_type
varchar(32) DEFAULT NULL NULL,\n" +
"tenant_id
varchar(32) NOT NULL,\n" +
"name
varchar(64) NOT NULL,\n" +
"type
varchar(32) NOT NULL,\n" +
"iaas_id
varchar(32) DEFAULT NULL NULL,\n" +
"utc_create
timestamp DEFAULT current_timestamp() NOT NULL,\n" +
"utc_modified
timestamp DEFAULT NULL NULL,\n" +
"CONSTRAINT pk_accessor_id
PRIMARY KEY (id
),\n" +
"CONSTRAINT uni_accessor_name
UNIQUE (name
)\n" +
");\n";
//执行添加的 SQL 语句
// state.execute(sql_insert);
String index_sql = "CREATE INDEX IF NOT EXISTS idx_accessor_utc_create
ON accessor
(utc_create
);";
state.execute(sql_insert+index_sql);
}
报错信息:
dm.jdbc.driver.DMException: 第13 行附近出现错误:
不支持的语句类型
at dm.jdbc.driver.DBError.throwException(DBError.java:696)
at dm.jdbc.b.b.o.E(MSG.java:560)
at dm.jdbc.b.b.o.B(MSG.java:520)
at dm.jdbc.b.b.o.A(MSG.java:501)
at dm.jdbc.b.a.a(DBAccess.java:230)
at dm.jdbc.b.a.a(DBAccess.java:701)
at dm.jdbc.driver.DmdbStatement.executeInner(DmdbStatement.java:723)
at dm.jdbc.driver.DmdbStatement.do_execute(DmdbStatement.java:189)
at dm.jdbc.driver.DmdbStatement.do_execute(DmdbStatement.java:181)
at dm.jdbc.driver.DmdbStatement.execute(DmdbStatement.java:1230)
at cn.com.antcloud.apyunqing.test.service.ExampleTest.main(ExampleTest.java:60)
Process finished with exit code 0
达梦驱动版本:
默认是只能执行一条,多条的话还是要用方法:state.excuteexcuteBatch()
因为
state.excute
方法一次只能执行一条sql,这是jdbc的标准,和驱动没有关系。如果要执行多条sql,要用
excuteBatch()
方法:String sql_insert = "CREATE TABLE accessor (\n" + "id int AUTO_INCREMENT NOT NULL,\n" + "user_id varchar(32) NOT NULL,\n" + "user_type varchar(32) DEFAULT NULL NULL,\n" + "tenant_id varchar(32) NOT NULL,\n" + "name varchar(64) NOT NULL,\n" + "type varchar(32) NOT NULL,\n" + "iaas_id varchar(32) DEFAULT NULL NULL,\n" + "utc_create timestamp DEFAULT current_timestamp() NOT NULL,\n" + "utc_modified timestamp DEFAULT NULL NULL,\n" + "CONSTRAINT pk_accessor_id PRIMARY KEY (id),\n" + "CONSTRAINT uni_accessor_name UNIQUE (name)\n" + ");\n"; String index_sql = "CREATE INDEX IF NOT EXISTS idx_accessor_utc_create ON accessor (utc_create);"; state.addBatch(sql_insert); state.addBatch(index_sql); state.executeBatch();