如何从 SQL 脚本、JDBC 或 Spring JdbcTemplate 在 MySQL 中创建函数?

Posted

技术标签:

【中文标题】如何从 SQL 脚本、JDBC 或 Spring JdbcTemplate 在 MySQL 中创建函数?【英文标题】:How to create a function in MySQL from an SQL script, JDBC or Spring JdbcTemplate? 【发布时间】:2012-08-14 19:36:20 【问题描述】:

我正在寻找一种在 mysql 中创建函数的方法,最好是通过脚本(从 Java 执行),但标准 JDBC 或 Spring 的 JdbcTemplate 也可以。

我已经成功地使用 mysql 命令行控制台创建了函数:

DELIMITER $$
CREATE FUNCTION test() RETURNS double DETERMINISTIC
BEGIN
  RETURN 63;
END$$

但是由于DELIMITER 不是有效的 SQL 语法,所以在从脚本运行它时出现异常:

[42000][1064] 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 $$

当我尝试使用 Spring JDBC 模板创建它时

jdbcTemplate.execute("CREATE FUNCTION some() RETURNS double DETERMINISTIC\n" +
            "BEGIN\n" +
            "RETURN 63;\n" +
            "END;");

我得到以下异常:

Caused by: 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 
'CREATE FUNCTION some() RETURNS double DETERMINISTIC
BEGIN
RETURN 63;
END' at line 1`

有人知道怎么做吗?

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

您可以使用 jdbc 来执行此操作,但在您的脚本中不要声明任何分隔符,然后将您自己的分隔符用于分隔函数或过程声明 您的脚本将如下所示:

CREATE FUNCTION do_something() RETURNS double DETERMINISTIC
BEGIN
  RETURN 63;
END;;
CREATE FUNCTION do_other_thing() RETURNS double DETERMINISTIC
BEGIN
  RETURN 63;
END;;

将你的 sql 脚本放入 StringBuilder 后,使用的代码将是这样的

 String[] sql = stringBuilder.toString().split(";;");
    for (int i = 0; i < sql.length; i++) 
                     statment.executeUpdate(sql[i]);
                

我希望这会有所帮助!

【讨论】:

【参考方案2】:

使用 Spring Framework 时,请使用 Hibernate Framework 连接数据。

【讨论】:

当然没问题,但在这种情况下真的对我有帮助吗? 你有什么论据来支持这个明确的声明吗?

以上是关于如何从 SQL 脚本、JDBC 或 Spring JdbcTemplate 在 MySQL 中创建函数?的主要内容,如果未能解决你的问题,请参考以下文章

Spring JDBC 在运行 SQL 脚本时无法处理 DECLARE 语句

jsp页面前台用jdbc如何获取sql数据库里的数据。

Spring JDBC Template SQL-Query 按日期过滤

无法从 .sql 文件创建存储过程 - JDBC

如何使用 JDBC 执行 .sql 脚本文件 [重复]

从 Camel 和 Spring Boot 到 MS SQL Server 的 JDBC