executeSqlScript 因 Spring for PL/SQL 块而失败 [英] executeSqlScript fails with Spring for PL/SQL block
问题描述
我正在尝试使用以下外部 SQL 文件使用 AbstractTransactionalJUnit4SpringContextTests
中的内置函数 executeSqlScript
填充我的数据库.
Im trying to populate my database using the builtin function executeSqlScript
from AbstractTransactionalJUnit4SpringContextTests
using the following external SQL file.
declare
id number;
begin
insert into table1 (field1) values ('V1') returning account__id into id;
insert into table2 (my_id, field2) VALUES (id, 'Value3');
end;
但是我收到以下错误.我不确定我允许在我想使用 executeSqlScript
执行的 SQL 文件中做什么.
However im getting the following error. Im not sure what im allowed to do in a SQL file I would like to execute using executeSqlScript
.
org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement at line 1 of resource class path resource [testdata.sql]: declare id number; nested exception is java.sql.SQLException: ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
:= . ( @ % ; not null range default character
Caused by: java.sql.SQLException: ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
:= . ( @ % ; not null range default character
所以我的问题是:我可以在 executeSqlScript
的 SQL 文件中表达什么?我收到错误的原因是什么?
So my questions are:
What am I allowed to express in the SQL file for executeSqlScript
?
What is the cause of the error im reciving?
推荐答案
您似乎试图在脚本中使用 PL/SQL 的功能.
It appears that you are attempting to use features of PL/SQL in your script.
AbstractTransactionalJUnit4SpringContextTests
中的 executeSqlScript(..)
方法在幕后内部委托给 ScriptUtils.executeSqlScript(..)
和 >ScriptUtils
仅支持纯 SQL 脚本.
The executeSqlScript(..)
methods in AbstractTransactionalJUnit4SpringContextTests
internally delegate to ScriptUtils.executeSqlScript(..)
behind the scenes, and ScriptUtils
only supports pure SQL scripts.
因此,您可能需要切换到简单的 SQL 语句并找到一种不同的机制来从 table1
检索 account__id
的值.
So you'll likely need to switch to simple SQL statements and find a different mechanism for retrieving the value of the account__id
from table1
.
另一个选项(我未尝试过)是将语句分隔符更改为 ";"
以外的其他内容(例如,"end;"
),但你不能通过 AbstractTransactionalJUnit4SpringContextTests.executeSqlScript
做到这一点.相反,您需要调用 ScriptUtils.executeSqlScript(..)
或(也许最好)使用 ResourceDatabasePopulator
.
Another option (which I have not tried) would be to change the statement separator to something other than ";"
(e.g., "end;"
), but you cannot do that via AbstractTransactionalJUnit4SpringContextTests.executeSqlScript
. Instead, you'd need to invoke ScriptUtils.executeSqlScript(..)
or (perhaps preferably) use a ResourceDatabasePopulator
.
这篇关于executeSqlScript 因 Spring for PL/SQL 块而失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!