我有一个存储过程在MySQL Workbench中运行良好,但是当Spring使用ResourceDatabasePopulator运行时,会出现语法错误。
查阅资料发现类似问题应该在脚本中设置分隔符,我已经按照这个方法操作,但是仍然存在相同的错误。
这是存储过程:
这是存储过程:
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 ;
这是一个异常情况
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
一起使用,因为它期望;
作为分隔符,并且使用它来确定行的结束。 - M. DeinumResourceDatabasePopulator
中或者实现自己的DatabasePopulator
并设置分隔符,并对其他脚本使用默认的DatabasePopulator
。 - M. Deinum