从文件创建存储过程

Posted

技术标签:

【中文标题】从文件创建存储过程【英文标题】:Create Stored Procedure from File 【发布时间】:2015-05-01 03:37:10 【问题描述】:

我正在尝试在 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

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

【问题讨论】:

只是为了理解,您将 .sql 文件拆分为单独的语句,然后执行每个语句。你遇到了什么错误?您使用的是什么 JDBC 调用?这是一些示例 JDBC 代码xyzws.com/javafaq/… “我无法让它以 JDBC 方式工作”是什么意思 更新了我的问题。 顺便说一句,这已在 16 小时前修复。我删除了所有分隔符语句并在“getProcedureStatements”中读入了整个过程语句。这样它在 JDBC 中执行。 【参考方案1】:

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

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

【讨论】:

以上是关于从文件创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

使用命令将存储过程查询从 sql 文件导入 Oracle DB

选择多个存储过程时如何强制VS2008“生成创建脚本到项目”到多个文件?

db2如何创建存储过程

Plsql developer 工具创建存储过程,必须要在package 文件下创建存储声明 pa

使用存储过程中的数据创建 Excel 文件,以将其附加到 Power Automate 中的电子邮件中

在 PHP 中使用 PDO 创建存储过程