为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
DM Database Server 6 4 V8
DB Version: 0x7000c
03134284094-20231011-204277-20067
【操作系统】:Kylin Linux Advanced Server V10 (Lance)
【CPU】:x6 4
【问题描述】*:我需要实现一个需求,允许用户传入数据库配置,系统使用配置进行数据库的初始化,行为包括模式的创建、表的创建及初始化数据的导入。使用了依靠达梦迁移工具从mysql迁移到dm再从dm迁移到sql文件的SQL脚本,使用如下Java代码运行SQL脚本时发生错误
try (Connection connection = DriverManager.getConnection(url, properties)) {
Statement statement = connection.createStatement();
statement.execute(IoUtil.readUtf8(this.getClass().getClassLoader().getResourceAsStream(dataSourceType.getInitSql())));
}
错误:
dm.jdbc.driver.DMException: 第 2 行, 第 8 列[SCHEMA]附近出现错误:
语法分析出错
at dm.jdbc.driver.DBError.throwException(DBError.java:711)
at dm.jdbc.a.b.o.x(MSG.java:591)
at dm.jdbc.a.b.o.C(MSG.java:526)
at dm.jdbc.a.b.o.B(MSG.java:507)
at dm.jdbc.a.a.a(DBAccess.java:245)
at dm.jdbc.a.a.a(DBAccess.java:729)
at dm.jdbc.driver.DmdbStatement.executeInner(DmdbStatement.java:730)
at dm.jdbc.driver.DmdbStatement.do_execute(DmdbStatement.java:190)
at dm.jdbc.driver.DmdbStatement.do_execute(DmdbStatement.java:182)
at dm.jdbc.driver.DmdbStatement.execute(DmdbStatement.java:1294)
如图,脚本一二行均为创建模式命令
移除第二行后重新尝试报出以下错
dm.jdbc.driver.DMException: 第 354 行, 第 1 列[INSERT]附近出现错误:
语法分析出错
at dm.jdbc.driver.DBError.throwException(DBError.java:711)
at dm.jdbc.a.b.o.x(MSG.java:591)
at dm.jdbc.a.b.o.C(MSG.java:526)
at dm.jdbc.a.b.o.B(MSG.java:507)
at dm.jdbc.a.a.a(DBAccess.java:245)
at dm.jdbc.a.a.a(DBAccess.java:729)
at dm.jdbc.driver.DmdbStatement.executeInner(DmdbStatement.java:730)
at dm.jdbc.driver.DmdbStatement.do_execute(DmdbStatement.java:190)
at dm.jdbc.driver.DmdbStatement.do_execute(DmdbStatement.java:182)
at dm.jdbc.driver.DmdbStatement.execute(DmdbStatement.java:1294)
创建一个模式和若干表后,执行插入的命令导致了报错
整个SQL脚本复制粘贴到DM管理工具中执行是没有问题的,当数据库为MySQL时,statement.execute可以正常运行包含多种类型SQL语句的脚本,所以问题出在达梦数据库上。
请问如何修改代码,或者说有什么其他方式能够在Java中导入整个SQL脚本?
可通过以下步骤实现sql文件脚本的批量执行
1、读取SQL文件:使用Java的文件I/O API读取SQL文件的内容。
2、分割SQL语句:由于SQL文件可能包含多条SQL语句,你需要按照某种方式(如分号;)来分割它们。
3、连接到达梦数据库:使用JDBC连接到你的达梦数据库。
4、执行SQL语句:使用JDBC的Statement或PreparedStatement对象来执行每条SQL语句。
5、处理异常和关闭资源:确保你的代码能够妥善处理可能出现的异常,并在执行完毕后关闭所有资源(如数据库连接、语句对象等)
范例如下: