当前位置: 首页 > 知识库问答 >
问题:

如何在JdbcTemplate中创建mySQL存储过程

况庆
2023-03-14

为了解决MySql中的问题,即某些语句只允许在我试图创建的存储过程中运行,然后在JdbcTem板提交的sql中删除存储过程。一个简单的例子是(这恰好是在Spring引导中):

@Service
public class StartupDatabaseCheck {
    private JdbcTemplate template;

    @Autowired
    public StartupDatabaseCheck(JdbcTemplate template){
        this.template = template;
    }

    @PostConstruct
    public void init() {
        log.info("Running custom fields table creation (if required)");
        try {
            String migrateSql = Resources.toString(Resources.getResource("migrateScript.sql"), Charsets.UTF_8);
            template.execute(migrateSql);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

cript.sql在哪里

DELIMITER //
CREATE PROCEDURE migrate()
BEGIN
    IF ((SELECT count(1)
         FROM INFORMATION_SCHEMA.COLUMNS
         WHERE table_name = 'custom_field_instance_data'
           and column_name='entity_id' and is_nullable = false) > 0)
    THEN
        alter table custom_field_instance_data MODIFY COLUMN entity_id char(32) null;
    END IF;
END //
DELIMITER ;

call migrate;

drop procedure migrate;

在mySql workbench中运行它可以很好地工作,但是由JdbcTemplate提交时会出现错误

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 PROCEDURE migrate_custom_fields()

据我所知,这是因为JdbcTemplate不允许使用那些分隔符语句,但按照链接中的建议删除它们会导致其他语法错误

JdbcTemplate如何创建mySQL存储过程(或者通常只允许在存储过程中执行语句)

没有deliminator语句的错误是

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 PROCEDURE migrate_custom_fields()

共有1个答案

齐阎宝
2023-03-14

驱动程序似乎没有将分隔查询纳入帐户。如果要使用jdbc动态创建存储过程。使用以下属性并将其作为URL中的连接参数传递。

jdbc:mysql://localhost:3306/test?allowMultiQueries=true

上述属性将允许“;”分隔查询。您可以在这里找到更多关于使用JPA Hibernate创建MySQL存储过程的信息

更新的migrateScript。在本例中,sql将是

drop procedure IF EXISTS migrate_custom_fields;

CREATE PROCEDURE migrate_custom_fields()
BEGIN
    IF ((SELECT count(1)
         FROM INFORMATION_SCHEMA.COLUMNS
         WHERE table_name = 'custom_field_instance_data'
           and column_name='entity_id' and is_nullable = false) > 0)
    THEN
        alter table custom_field_instance_data MODIFY COLUMN entity_id char(32) null;
    END IF;
END ;

call migrate_custom_fields;

drop procedure migrate_custom_fields;
 类似资料:
  • MySQL 存储过程是一些 SQL 语句的集合,比如有时候我们可能需要一大串的 SQL 语句,或者说在编写 SQL 语句的过程中需要设置一些变量的值,这个时候我们就完全有必要编写一个存储过程。 编写存储过程并不是件简单的事情,但是使用存储过程可以简化操作,且减少冗余的操作步骤,同时,还可以减少操作过程中的失误,提高效率,因此应该尽可能的学会使用存储过程。 下面主要介绍如何创建存储过程。 可以使用

  • 我正试图在MySQL中创建一个存储过程,但我一直收到错误消息 #1064年的今天,您的SQL语法出现错误;查看与您的MariaDB服务器版本对应的手册,以了解第1行“DELIMITER”附近使用的正确语法 预期分隔符。(在位置10的“”附近) 我做错了什么?编辑:去掉错误后,现在我的程序只是插入空值,知道为什么吗?

  • 问题内容: 可能是一个非常新手的问题,但我一直在阅读,发现在理解密码的创建和存储方面有些困难。从我读过的内容中,md5 / hash密码是将其存储在数据库中的最佳方法。但是,我将如何首先创建这些密码? 因此,说我有一个登录页面,其中包含用户bob和密码bob123-我将如何1.将bobs密码输入数据库(以哈希开头)2.如何获取并确认哈希密码? 谢谢 问题答案: 编辑2017/11/09:请务必查看

  • 我想使用phpmyadmin在MySQL数据库中进行存储过程。 几分钟后,我在“创建过程”对话框中键入并按下GO,我的语法出现了错误。 我在谷歌上搜索过哪一个是错的,但仍然没有找到。请任何人给我一些建议如何解决这个问题。 这是我的MySQL存储过程查询。 我有这样的错误 处理您的请求: 以下查询失败:"CREATE DEFINER=@PROCEDURE(INBIT(1), ININT, INDAT

  • 问题内容: 我有一个存储过程,该过程将通过复制旧表的结构来创建新表。但是在创建新表之前,我需要检查该表是否存在,如果存在,则需要先删除该表。这是我的存储过程。 但是,如果该表存在,我总是会收到类似以下的错误。哪里错了? 问题答案: 让我感到难过…在这种情况下,“如果存在”似乎无法与exec配合使用。更新了以下脚本:

  • 问题内容: 我有这个存储过程。例如,如何间隔5秒运行一次?像删除时间戳超过一天的数据的例程一样? 问题答案: 您可以使用mysql Scheduler每5秒运行一次。您可以在以下网址找到示例:http://dev.mysql.com/doc/refman/5.1/en/create- event.html 从未使用过它,但我希望它能起作用: