I. *_*kov 7 java mysql spring stored-procedures spring-boot
我在 Spring Boot 应用程序中使用schema.sql文件到CREATE/DROP表,它工作正常。
但是当我添加了更改表的程序时:
DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
IF NOT EXISTS( SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'test_table'
AND table_schema = 'test'
AND column_name = 'cc_test_id') THEN
alter table test_table add cc_test_id VARCHAR(128) NOT NULL;
END IF;
END $$
call Alter_Table;
Run Code Online (Sandbox Code Playgroud)
我收到了:
Run Code Online (Sandbox Code Playgroud)com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException exception.
但是,在 MySQL 工作台中执行此过程并成功完成。
那么,有人应该知道这个问题的原因是什么,让我知道吗?
Here is the solution I found that works well enough, though it is not ideal as you have to change your SQL script.
In your application.properties file change the DataSource separator property:
spring.datasource.separator=^;
Run Code Online (Sandbox Code Playgroud)
Then update your schema.sql file to look as follows:
CREATE PROCEDURE Alter_Table()
BEGIN
IF NOT EXISTS( SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'test_table'
AND table_schema = 'test'
AND column_name = 'cc_test_id') THEN
alter table test_table add cc_test_id VARCHAR(128) NOT NULL;
END IF;
END ^;
call Alter_Table ^;
Run Code Online (Sandbox Code Playgroud)
The DELIMITER command only works with the MySQL CLI client and Workbench and will not work for Spring Boot database initialization. Once you have removed the DELIMITER commands, Spring Boot will still throw an exception as it will not understand the ; characters in the stored procedures are not separate statements, so you have to change the datasource separator property as a workaround.
这是修复:
将您的spring.datasource.separator属性设置为^^^ END OF SCRIPT ^^^,Spring Boot 会将您的整个 schema.sql 脚本作为单个语句执行。
原因如下:
Spring Boot 将您的 schema.sql 脚本拆分为语句,然后将每个语句单独发送到数据库以供执行。默认情况下,脚本以分号分隔,因为这是spring.datasource.separator属性的默认值(根据文档)。这会导致您的 schema.sql 被拆分,并且执行的第一条语句如下:
DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
IF NOT EXISTS( SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'test_table'
AND table_schema = 'test'
AND column_name = 'cc_test_id') THEN
alter table test_table add cc_test_id VARCHAR(128) NOT NULL
Run Code Online (Sandbox Code Playgroud)
这是无效的 SQL,因为美元引号永远不会在语句中终止。
javadoc fororg.springframework.jdbc.datasource.init.ScriptUtils.EOF_STATEMENT_SEPARATOR很好地解释了我建议的解决方案的工作原理:
文件结束 (EOF) SQL 语句分隔符:“^^^ END OF SCRIPT ^^^”。
该值可以作为分隔符提供给 executeSqlScript(Connection, EncodedResource, boolean, boolean, String, String, String, String) 以表示 SQL 脚本包含一个没有显式语句分隔符的单个语句(可能跨越多行)。请注意,这样的脚本实际上不应包含此值;它只是一个虚拟语句分隔符。
| 归档时间: |
|
| 查看次数: |
4648 次 |
| 最近记录: |