2016-05-19 9 views
0

Während Liquibase-Funktion, erweiterte ich liquibase.sqlgenerator.core.CreateIndexGenerator Klasse diesen Befehl wie folgtHinzufügen a/als Ende delimeter auf Liquibase Oracle SQL-Anweisung

create index indexI on tableT(columnC) 

in etwas zu konvertieren:

declare 
    index_already_exists exception; 
    pragma exception_init(index_already_exists, -955); 
    -- 
begin 
    execute immediate 'create index indexI on tableT(columnC)'; 
exception 
    when index_already_exists then 
    dbms_output.put_line('Warning: Index indexI already exists'); 
end; 

, um es idempotent zu machen und einige neue Validierungen zu erstellen.

Es funktioniert einwandfrei bei der Verwendung mvn liquibase: update. Aber beim Generieren der SQL mit mvn liquibase: updateSQL ein abschließendes/(Schrägstrich) fehlt.

Mit Blick auf Liquibase Source fand ich heraus, dass die Klasse LoggingExecutor verwendet zu haben, was ich auf Verfahren benötigen outputStatement

} else if (database instanceof OracleDatabase) { 
    output.write(StreamUtil.getLineSeparator()); 
    output.write("/"); 

Ich habe versucht, einen endgültigen/(Schrägstrich) nach dem Ende hinzuzufügen; wenn, aber es so wird:

end; 
/; 

welche ungültig PLSQL Code

Gibt es eine andere Art und Weise ist der/als Ende delimeter eine endgültige/auf dem SQL-Code erzeugt, oder setzen Sie hinzufügen?

Antwort

0

Anstatt CreateIndexGenerator zu erweitern, können Sie stattdessen CreateIndexChange.generateStatements() überschreiben, um ein RawSqlStatement mit Ihrem SQL zurückzugeben. Dadurch können Sie den Endbegrenzer besser einstellen und arbeiten möglicherweise besser mit dem LoggingExecutor.

0

Ich benutze Liquibase 3.4.2 und das Ende Delimiter/wird automatisch erkannt. Wenn ich automatisch meine, müssen Sie in der Deklaration des Changesets nicht die Eigenschaft endDelimiter verwenden. Es stellt sich heraus, dass in einigen älteren Versionen von liquibase während des Parsens ein Fehler aufgetreten ist. Bitte überprüfen Sie http://www.liquibase.org/2015/06/liquibase-3-4-0-released.html und Sie werden sehen, dass sie das Problem beheben https://liquibase.jira.com/browse/CORE-2227. Dieses Problem betrifft die Version 3.3.2. Also ich empfehle Ihnen, eine neuere Version zu verwenden oder die endDelimiter-Eigenschaft in der Deklaration des Changeset korrekt anzugeben.

http://www.liquibase.org/documentation/changes/sql.html