在H2中使用Flyway创建存储过程以JdbcSQLSyntaxErrorException结束,在MySQL中它工作正常

问题描述 投票:0回答:1

我们改变了数据结构。因此,我们需要向表中添加更多列,用一些现有列中的数据自动填充它们,并删除一些旧列。这应该是一项简单的任务。

背景:我们正在使用 Flyway 进行数据库迁移的 Spring Boot 3 应用程序。在本地(以及用于单元测试),我们使用 H2 InMemory 数据库,该数据库将在每次启动时重新创建。在云环境中,我们使用 MySQL8 数据库。

我对迁移脚本的想法是:

  1. 更改表格以添加新列
  2. 创建一个存储过程,循环访问表并使用现有数据填充新字段
  3. 执行一次stp,然后再次删除
  4. 再次更改表格以删除过时的列

我首先实现了该脚本并在本地进行了尝试(H2)。它遇到了 org.h2.jdbc.JdbcSQLSyntaxErrorException 因为 Flyway 似乎无法识别

delimiter $$
语句。但是在MySQL数据库的环境中测试脚本,它工作正常。

脚本看起来像这样(删除了工作部分):

delimiter $$
create procedure migrate_services()
begin
    declare finished boolean default false;

    -- declaring more variables

    declare cur_services cursor for select /* the fields to use */
                                    from services;
    declare continue handler for not found set finished = true;
    open cur_services;
    process_service :
    loop
        if finished = true then
            leave process_service;
        end if;
        fetch cur_services into /* the above declared variables */;
        /* computing data to be written into the new columns */
        update services
        set /* setting new data */
        where uuid = current_uuid;
    end loop;
    close cur_services;
end$$
delimiter ;

我尝试了一些不同的分隔符。我尝试删除分隔符。我花了一个下午的时间在谷歌上搜索这个问题,但没有找到合适的解决方案。

mysql spring-boot migration h2 flyway
1个回答
0
投票

您正在 Spring Boot 3 中创建存储过程?尝试省略

DELIMITER
命令并将
CREATE PROCEDURE
语句作为单个命令执行。

仅在使用命令行客户端时才需要

DELIMITER
命令。它用于将不同的 SQL 命令相互分隔并更改默认的分号分隔符,因为过程内部使用分号。

© www.soinside.com 2019 - 2024. All rights reserved.