【问题标题】:Flyway parser fails while trying to create oracle packages from .sql scriptFlyway 解析器在尝试从 .sql 脚本创建 oracle 包时失败
【发布时间】: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 解析器出了什么问题,或者可以为我提供解决方法吗?

【问题讨论】:

    标签: oracle flyway


    【解决方案1】:

    (评论太长了,所以我将其发布为答案)

    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;
    /
    

    工作得很好。你能用这个脚本试一试并发布你的发现吗?

    【讨论】:

    • 我已经在我的 Java 应用程序中尝试了你的脚本,你是对的,它工作正常。我仍然觉得奇怪的是我的原始脚本(仍然)不起作用,但我现在通过将文件拆分为多个文件(即一个文件用于包,一个文件用于包主体等)解决了这个问题。谢谢。
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 2021-08-23
    • 2021-04-05
    • 2013-04-09
    • 2020-01-23
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多