2016-03-10 78 views
0

我有一個存儲過程,在MySql工作臺中正常工作,但是當它由Spring運行時,使用ResourceDatabasePopulator時,它會失敗並出現語法錯誤。 閱讀這裏有類似的問題,應在腳本中設置分隔符,我已經遵循這些但仍然存在相同的錯誤。春季和MySQL存儲過程

這是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 ; 

這是個例外

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] 

有沒有人有一個線索,如何解決這一問題?這只是春天,我覺得令人沮喪的使用普通的Java我不會有問題。

更新包含彈簧代碼 按照這裏要求的是我繼承的運行腳本的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(); 
+1

該腳本不會與'ResourceDatabasePopulator'一起工作,因爲它預計'''是分隔符,它使用它來確定行的結尾。 –

+0

@M。 Denium你好,謝謝你的回覆。是的,我意識到這是問題,但問題是如何解決它,因此它會運行。你當然不能說存儲過程不能用於ResourceDatabasePopulator!設置DELIMITER沒有任何區別,並使用databasePopulator.setSeparator(「$$」)在Spring中設置分隔符;導致所有其他腳本失敗,這是預期的。任何人都知道我可以如何解決這個問題,以便我可以使用ResourceDatabasePopulator運行存儲過程? – Gurnard

+0

你不能。你也沒有運行你正在定義的存儲過程。作爲解決方案,您可以嘗試將其放在單獨的'ResourceDatabasePopulator'中,或者使用設置的分隔符來實現您自己的'DatabasePopulator',併爲其他腳本使用默認值。 –

回答

0

我用;;作爲我的分隔符設置它ResourceDatabasePopulator.setSeperator()

這似乎並沒有打破其他的東西,並在我的數據庫IDE中運行。我的數據庫IDE(dbVisualizer)看到2個分離器,並不在乎。