gpt4 book ai didi

mysql - 使用 Spring 的 "jdbc:initialize-database",如何使用存储过程运行脚本?

转载 作者:可可西里 更新时间:2023-11-01 07:49:50 25 4
gpt4 key购买 nike

我使用的是 Spring 3.1.1.RELEASE、JUnit 4.8.1 和 MySQL 5.5。我想在每次测试前截断我所有的表数据,但在 Spring 中出现错误,即使我可以通过命令行正常执行以下脚本 (truncate_tables.sql) ......

drop procedure if exists truncate_tables;

delimiter #
create procedure truncate_tables()
begin
declare tab_name varchar(64);
declare done tinyint unsigned default 0;

declare table_cur cursor for select t.table_name
from
information_schema.schemata s
inner join information_schema.tables t on s.schema_name = t.table_schema
where
s.schema_name = database() and t.table_type = 'BASE TABLE';

declare continue handler for not found set done = 1;

open table_cur;
repeat
fetch table_cur into tab_name;
set @cmd = concat('truncate table ', tab_name);

prepare stmt from @cmd;
execute stmt;
until done end repeat;

close table_cur;
end #

SET FOREIGN_KEY_CHECKS=0;
CALL truncate_tables;
SET FOREIGN_KEY_CHECKS=1;

但是,使用这个 Spring 应用程序上下文......

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/my_db" />
<property name="username" value="myuser" />
<property name="password" value="bypass" />
</bean>
...
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:truncate_tables.sql"/>
<jdbc:script location="classpath:db-test-data.sql"/>
</jdbc:initialize-database>

但是,我得到了错误

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &apos;delimiter # create procedure truncate_tables() begin  declare tab_name varchar(6&apos; at line 1
at sun.reflect.GeneratedConstructorAccessor419.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:842)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:681)
at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.executeSqlScript(ResourceDatabasePopulator.java:184)

... 50 more

有什么方法可以修复上面的脚本吗?在我的 JUnit 测试中使用“extends AbstractTransactionalJUnit4SpringContextTests”扩展不是一个选项。

最佳答案

<jdbc:script />不允许在包含的脚本中使用 DELIMITER 语句,但您可以使用 separator具有相同结果的属性。

在你的truncate_tables.sql仅使用 #分隔符并在 separator 中指定像这样的属性:

drop procedure if exists truncate_tables#

create procedure truncate_tables()
begin
declare tab_name varchar(64);
declare done tinyint unsigned default 0;

declare table_cur cursor for select t.table_name
from
information_schema.schemata s
inner join information_schema.tables t on s.schema_name = t.table_schema
where
s.schema_name = database() and t.table_type = 'BASE TABLE';

declare continue handler for not found set done = 1;

open table_cur;
repeat
fetch table_cur into tab_name;
set @cmd = concat('truncate table ', tab_name);

prepare stmt from @cmd;
execute stmt;
until done end repeat;

close table_cur;
end #

SET FOREIGN_KEY_CHECKS=0#
CALL truncate_tables#
SET FOREIGN_KEY_CHECKS=1#

并且在应用上下文中...

<jdbc:initialize-database data-source="dataSource">
<jdbc:script separator="#" location="classpath:truncate_tables.sql"/>
<jdbc:script location="classpath:db-test-data.sql"/>
</jdbc:initialize-database>

关于mysql - 使用 Spring 的 "jdbc:initialize-database",如何使用存储过程运行脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15486516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com