从文件创建存储过程

时间:2015-02-28 12:35:43

标签: java mysql stored-procedures jdbc liquibase

我正在尝试用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-Code #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
尝试执行#SPLIT 2时

Result

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方式工作。

1 个答案:

答案 0 :(得分:0)

语句DELIMITER \\实际上不是SQL - 它是由mysql命令行工具(可能还有他们的GUI工具)解释的命令,但如果你直接将它传递给执行引擎,会得到这种语法错误。

不幸的是,Liquibase使用;作为默认语句分隔符,因此很难使用SQL文件和Liquibase来处理这类事情。我已经提出了一个pull请求,允许从Liquibase命令行设置分隔符 - 请参阅https://github.com/liquibase/liquibase/pull/361