我正在尝试用 Java 执行整个目录的 .SQL
文件。
我正在努力执行存储过程。我找到了 this遗憾的是,到目前为止(最有帮助的)包括无效链接。我也下载了 liquibase,但我不知道应该如何使用它。
在我当前的代码中,我将包含过程的文件拆分为不同的语句:
(在 Vector[String] 中拆分并在 for 循环中执行的语句)
例子:
//File f;
//Statement st;
Vector<String> vProcedure = getProcedureStatements(f, Charset.defaultCharset(), "//");
for (Iterator<String> itr = vProcedure.iterator(); itr.hasNext();)
st.execute(itr.next());
System.out.println(f.getName() + " - done executing.");
Vector 包含四个元素(参见 SQL 代码#SPLIT x)。
DROP PROCEDURE IF EXISTS `Add_Position`; #SPLIT 1
DELIMITER // #SPLIT 2
CREATE PROCEDURE `Add_Position`
(
IN iO_ID INT,
IN iCID INT,
IN iWID INT,
IN iA INT
)
BEGIN
#statements;
END
// #SPLIT 3
DELIMITER ; #SPLIT 4
Result尝试执行#SPLIT 2 时:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER //' at line 1
问:谁能告诉我是否有可以使用的外部库,或者 liquibase 是如何工作的?我无法让它以 JDBC 方式工作。
最佳答案
语句 DELIMITER\\
实际上不是 SQL - 它是由 mysql 命令行工具(可能还有他们的 GUI 工具)解释的命令,但是如果你直接将它传递给执行引擎,你会得到这个语法错误。
不幸的是,Liquibase 使用 ;
作为默认的语句分隔符,因此很难使用 SQL 文件和 Liquibase 来实现这种事情。我已经提交了一个拉取请求以允许从 Liquibase 命令行设置分隔符 - 请参阅 https://github.com/liquibase/liquibase/pull/361 .
关于java - 从文件创建存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28781769/