【发布时间】:2017-02-04 20:34:38
【问题描述】:
我有一个存储在 .sql 文件中的 SQL 脚本,其中包含如下几条语句:
create or replace package <schema>.custom_package is
procedure getReleaseEmployees(p_Cursor in out sys_refcursor, p_Role in string);
end custom_package;
/
create or replace package <schema>.pck_account_monitoring is
procedure checkAndLockOracleAccount;
end pck_account_monitoring;
/
<...some more packages following>
在 SqlDeveloper 或 PL/SQLDeveloper 中针对我的数据库运行脚本可以正常工作。 现在,当我尝试使用 Java API 通过 Flyway 进行迁移时,我会收到以下错误消息并且 Flyway 的迁移失败:
SQL State : 42000
Error Code : 900
Message : ORA-00900: Invalid SQL Statement
Location : migrations/sql/V0_2__migration.sql
Line : 6172
Statement : end pck_account_monitoring
at org.flywaydb.core.internal.dbsupport.SqlScript.execute(SqlScript.java:117)
at org.flywaydb.core.internal.resolver.sql.SqlMigrationExecutor.execute(SqlMigrationExecutor.java:71)
at org.flywaydb.core.internal.command.DbMigrate.doMigrate(DbMigrate.java:352)
如果我尝试将第一条语句放在一行中,即
create or replace package quattro.custom_package is procedure getReleaseEmployees(p_Cursor in out sys_refcursor, p_Role in string); end custom_package;
/
<rest as before>
我会收到同样的错误消息,但解析器现在抱怨“/”符号和下一条语句的开头:
Error Code : 900
Message : ORA-00900: Invalid SQL Statement
...
Line : 6167
Statement : /
create or replace package quattro.pck_account_monitoring is ...
现在,如果我也删除第一个“/”,迁移将运行(但会出现警告)。 然后,我的模式将正确编译除第一个之外的所有其他包 - 即使每个其他包声明的格式都像我最初尝试中的第一个一样!然而,第一个包 (custom_package) 仍然丢失。
我的 Java 类基本上看起来像 Flyway 主页中的示例类。
有人知道 Flyway 解析器出了什么问题,或者可以为我提供解决方法吗?
【问题讨论】: