mysql - Spring和MySQL存储过程

标签 mysql spring stored-procedures spring-jdbc

我有一个存储过程在 MySql 工作台中运行良好,但是当它由 Spring 运行时,使用 ResourceDatabasePopulator,它失败并出现语法错误。 阅读周围有类似的问题,应该在脚本中设置分隔符,我已经按照这些问题进行操作,但仍然存在相同的错误。

这是SP

DELIMITER $$
CREATE PROCEDURE userAttributesOrder()
READS SQL DATA
    BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE i INT DEFAULT 0;
    DECLARE attCount INT DEFAULT 0;
        DECLARE cod VARCHAR(64) DEFAULT NULL;
        DECLARE curs CURSOR FOR SELECT CODE FROM PA_ATTR_TYPE ORDER BY NAME ASC;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        SET i = 0;    
        OPEN curs;
            read_loop: LOOP
                FETCH curs INTO cod;
                IF done THEN
                    LEAVE read_loop;
                END IF;
                INSERT INTO LAYOUT(ELEMENT_TYPE, ELEMENT_CODE, LAYOUT_ORDER) VALUES ('PA_ATTRIB', cod, i);
                SET i = i + 1;
            END LOOP;
        CLOSE curs;
    END$$
DELIMITER ;

这是个异常(exception)

org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of resource class path resource [database/updates/23-update.sql]: DELIMITER $$ CREATE PROCEDURE user
AttributesOrder() READS SQL DATA BEGIN DECLARE done INT DEFAULT FALSE; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corre
sponds to your MySQL server version for the right syntax to use near 'DELIMITER $$ CREATE PROCEDURE userAttributesOrder() READS SQL DATA BEGIN DECLARE' at line 1
        at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:472) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE]

有没有人知道如何解决这个问题?我发现只有 Spring 令人沮丧,因为使用纯 Java 我不会有这个问题。

包含更新 Spring 代码 这里要求的是我继承的运行脚本的 Spring 代码。

DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();

for (String script : orderedScripts) {
    databasePopulator.addScript(new ClassPathResource(script));
}

initializer.setDatabasePopulator(databasePopulator);
initializer.afterPropertiesSet();

最佳答案

我使用 ;; 作为分隔符,将其设置为 ResourceDatabasePopulator.setSeperator()

这似乎并没有破坏其他东西并在我的数据库 IDE 中运行。我的 DB IDE (dbVisualizer) 看到 2 个分隔符并且不在乎。

关于mysql - Spring和MySQL存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35911065/

相关文章:

PHP & MySQL - 数据库连接问题

c# - 在 C# 中,如何获取刚刚插入到 mysql 数据库中的对象的 ID?

java - Hibernate:迁移到 5.2.14,NPE

Java Springboot 应用程序返回用户密码身份验证失败 "postgres"

Java/Spring/JSP - 如何使用 ModelAndView.addObject 输出附加值

mysql - 在 MySQL 存储过程中的另一语句中使用一个选择查询中获得的结果

mysql - 以下 MySQL create 语句有什么问题?

python - 错误 1452 'Cannot add or update a child row'

sql-server - SQL Server 存储过程和 Linq-to-SQL

c# - 数据不会保存在我的数据库中