package liquibase.sqlgenerator.core; import liquibase.database.Database; import liquibase.database.core.OracleDatabase; import liquibase.database.typeconversion.TypeConverterFactory; import liquibase.exception.ValidationErrors; import liquibase.sql.Sql; import liquibase.sql.UnparsedSql; import liquibase.sqlgenerator.SqlGeneratorChain; import liquibase.statement.core.InsertOrUpdateStatement; import liquibase.statement.core.UpdateStatement; import java.util.Date; public class InsertOrUpdateGeneratorOracle extends InsertOrUpdateGenerator { @Override public boolean supports(InsertOrUpdateStatement statement, Database database) { return database instanceof OracleDatabase; } @Override protected String getRecordCheck(InsertOrUpdateStatement insertOrUpdateStatement, Database database, String whereClause) { StringBuffer recordCheckSql = new StringBuffer(); recordCheckSql.append("DECLARE\n"); recordCheckSql.append("\tv_reccount NUMBER := 0;\n"); recordCheckSql.append("BEGIN\n"); recordCheckSql.append("\tSELECT COUNT(*) INTO v_reccount FROM " + database.escapeTableName(insertOrUpdateStatement.getSchemaName(), insertOrUpdateStatement.getTableName()) + " WHERE "); recordCheckSql.append(whereClause); recordCheckSql.append(";\n"); recordCheckSql.append("\tIF v_reccount = 0 THEN\n"); return recordCheckSql.toString(); } @Override protected String getElse(Database database){ return "\tELSIF v_reccount = 1 THEN\n"; } @Override protected String getPostUpdateStatements(){ StringBuffer endStatements = new StringBuffer(); endStatements.append("END IF;\n"); endStatements.append("END;\n"); endStatements.append("/\n"); return endStatements.toString(); } }