Flyway 解析器在尝试从 .sql 脚本创建 oracle 包时失败
Flyway parser fails while trying to create oracle packages from .sql script
我有一个 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 class 基本上看起来像 Flyway 主页上的示例 class。
有谁知道 Flyway 解析器出了什么问题,或者可以为我提供解决方法吗?
(这对于评论来说太长了,因此,我post将其作为答案)
FWIW,我无法重现这个(使用 Flyway 3.2.1 命令行工具); 运行 这个示例脚本:
-- PACKAGES
create or replace package flyway_demo.custom_package is
procedure getReleaseEmployees(p_Cursor in out sys_refcursor, p_Role in string);
end custom_package;
/
create or replace package flyway_demo.pck_account_monitoring is
procedure checkAndLockOracleAccount;
end pck_account_monitoring;
/
create or replace package flyway_demo.logger
authid definer
as
-- TYPES
type rec_param is record(
name varchar2(255),
val varchar2(4000));
type tab_param is table of rec_param index by binary_integer;
g_off constant number := 0;
function is_number(p_str in varchar2)
return boolean;
end logger;
/
create or replace package body flyway_demo.pck_account_monitoring is
procedure checkAndLockOracleAccount is
begin
null;
end;
end pck_account_monitoring;
/
create or replace package body flyway_demo.custom_package is
procedure getReleaseEmployees(p_Cursor in out sys_refcursor, p_Role in string)
is
begin
open p_Cursor for select * from dual;
end;
end custom_package;
/
create or replace package body flyway_demo.logger
as
function is_number(p_str in varchar2) return boolean is
begin
return true;
end;
end logger;
/
工作得很好。您可以尝试使用此脚本和 post 您的发现吗?
我有一个 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 class 基本上看起来像 Flyway 主页上的示例 class。
有谁知道 Flyway 解析器出了什么问题,或者可以为我提供解决方法吗?
(这对于评论来说太长了,因此,我post将其作为答案)
FWIW,我无法重现这个(使用 Flyway 3.2.1 命令行工具); 运行 这个示例脚本:
-- PACKAGES
create or replace package flyway_demo.custom_package is
procedure getReleaseEmployees(p_Cursor in out sys_refcursor, p_Role in string);
end custom_package;
/
create or replace package flyway_demo.pck_account_monitoring is
procedure checkAndLockOracleAccount;
end pck_account_monitoring;
/
create or replace package flyway_demo.logger
authid definer
as
-- TYPES
type rec_param is record(
name varchar2(255),
val varchar2(4000));
type tab_param is table of rec_param index by binary_integer;
g_off constant number := 0;
function is_number(p_str in varchar2)
return boolean;
end logger;
/
create or replace package body flyway_demo.pck_account_monitoring is
procedure checkAndLockOracleAccount is
begin
null;
end;
end pck_account_monitoring;
/
create or replace package body flyway_demo.custom_package is
procedure getReleaseEmployees(p_Cursor in out sys_refcursor, p_Role in string)
is
begin
open p_Cursor for select * from dual;
end;
end custom_package;
/
create or replace package body flyway_demo.logger
as
function is_number(p_str in varchar2) return boolean is
begin
return true;
end;
end logger;
/
工作得很好。您可以尝试使用此脚本和 post 您的发现吗?