2017-02-07 49 views
1

我正在进行数据库迁移,其中我们将数据从1个表迁移到2个其他表。为此,我使用PL/SQL脚本。脚本的一个非常简化的版本低于可见:Liquibase脚本不会保留数据

BEGIN 
    FOR foo IN (SELECT * FROM FOO) LOOP 
    INSERT INTO BAR (ID, STATUS) 
    VALUES (foo.ID, foo.STATUS); 

    FOR foolog IN (SELECT * FROM FOO_LOG where ID = foo.ID) LOOP 
     INSERT INTO BAR_LOG (ID, REV); 
     VALUES (FOO_SEQ.CURRVAL, foolog.REV); 
    END LOOP; 
    END LOOP; 
END; 

的问题是:liquibase运行脚本,但是,它看起来好像脚本不运行任何数据被保存到数据库。如果我故意引入了一个打字错误(例如更改一个表名),那么脚本无法运行,因此它实际上执行了脚本。另外,当我手动运行SQL时,它按预期工作,所以看起来问题与liquibase有关。

任何线索为什么发生这种情况/如何解决这个问题?

编辑:用于

变更集:

<changeSet id="2.4.0-03" author="bvandenberge"> 
    <sqlFile path="03-pie-conversion.sql" 
      relativeToChangelogFile="true" 
      plitStatements="false" /> 
    <rollback /> 
</changeSet> 
+1

你有没有做过'提交;'在某个时候?这对于基于事务的数据库是必需的。 –

+0

@ J.Chomel我试着添加一个COMMIT;就在END之前;但这并没有改变行为。接下来,在liquibase中,所有变更集都在事务中运行,因此在这种情况下应该处理提交。 – Bob

+0

这是什么''用于? –

回答

0

我发现为什么它不工作,这是我自己的一个非常愚蠢的错误。与liquibase无关。

我通过Intellij Oracle控制台插入测试数据。显然,这个控制台默认运行事务中的所有内容,但不会自动提交。所以发生的事情是我通过Intellij插入了测试数据,然后在liquibase中运行脚本(因为Intellij中的事务未提交,因此未找到任何数据),然后尝试在Intellij中查看结果。在Intellij中手动编写测试数据事务后,一切正常。