使用Oracle编译的Flyway回调

时间:2015-08-05 14:51:01

标签: oracle compilation flyway

我尝试在迁移之前和迁移脚本之后添加为flyway的回调,用于编译我的视图,过程,函数等。 是否有可能在迁移过程之前停止它或在脚本失败之前或之后进行回滚(或者更确切地说是返回警告)?

因为我现在唯一看到的就是收到像这样的警告

  

[警告] DB:警告:执行完成时出现警告(SQL状态:99999 - 错误代码:17110)

然后继续,不停地。 我想到了FlywayCallback接口和它的实现,但我不完全确定应该如何完成编译。

我正在使用Spring Boot 1.2.5和最新的Flyway。

3 个答案:

答案 0 :(得分:4)

我也有同样的错误。 SQL State: 99999 - Error Code: 17110。我找到了这个解决方案 检查此警告下的哪个版本以及sql脚本检查下的该版本是否具有触发器或任何未正确关闭的过程。

关闭触发器或oracle DB /触发结束时的任何程序。

前:

CREATE OR REPLACE TRIGGER Print_salary_changes
  BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab
  FOR EACH ROW
WHEN (new.Empno > 0)
DECLARE
    sal_diff number;
BEGIN
    sal_diff  := :new.sal  - :old.sal;
    dbms_output.put('Old salary: ' || :old.sal);
    dbms_output.put('  New salary: ' || :new.sal);
    dbms_output.put_line('  Difference ' || sal_diff);
END;
/

答案 1 :(得分:0)

Flyway 5.0现在提供了一个名为错误处理程序的功能,可让您完成此操作。您现在可以创建一个错误处理程序,将该警告转换为错误,就像

一样
import org.flywaydb.core.api.FlywayException;
import org.flywaydb.core.api.errorhandler.Context;
import org.flywaydb.core.api.errorhandler.ErrorHandler;
import org.flywaydb.core.api.errorhandler.Warning;

public class OracleProcedureFailFastErrorHandler implements ErrorHandler {
    @Override
    public boolean handle(Context context) {
        for (Warning warning : context.getWarnings()) {
            if ("99999".equals(warning.getState()) && warning.getCode() == 17110) {
                throw new FlywayException("Compilation failed");
            }
        }
        return false;
    }
}

文档中的更多信息:https://flywaydb.org/documentation/errorhandlers

答案 2 :(得分:0)

当我的脚本有一个“CREATE TABLE XXX AS SELECT ...”语句时,我遇到了同样的错误。

我通过将其拆分为两个单独的语句来修复它:

CREATE TABLE XXX (columns def...);

INSERT INTO TABLE XXX (columns...)
SELECT...;