java - 从文件创建存储过程

标签 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 代码#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/

相关文章:

sql - 编写一个 PL/pgSQL 函数,以便在找到 "nothing"时不设置 FOUND?

java - Eclipse Juno 彩色代码折叠区域

java - 用于检测 Eclipse Activity 的 Eclipse 插件

mysql - 如何在 SQL 中获取与其他行具有相似标签的行

php - LIKE 子句在 wordpress 的 $wpdb->prepare() 中不起作用

php - 无法在 php 中连接到 mysql 8

postgresql - 允许将 RefCursor 作为 Postgresql 函数的 OUT 参数吗?

asp.net - 存储过程在 SQL Mgt Studio 中运行良好,但从 MVC 应用程序中抛出无效对象名称#AllActiveOrders

java - 在 Jasper 报告中将 String 转换为 Long

java - 在 Java 中向线程发出信号