Ошибка разметки Liquibase в createProcedure - PullRequest
0 голосов
/ 22 января 2019

Я использую liquibase для создания функций и получаю сообщение об ошибке при попытке использовать оператор < в SQL.

SQL:

      <createProcedure>
        CREATE OR REPLACE FUNCTION function(dateFrom timestamp, dateTo timestamp ) 
        RETURNS TABLE
        LANGUAGE plpgsql
        AS $$
        BEGIN
        SELECT * FROM
        ORDER BY date DESC
        WHERE date >= $2 AND date <  $3
        RETURN QUERY;
        END;
        $$;
     </createProcedure>

Ошибка:

Содержимое элементов должно состоять из правильно сформированных символьных данных или разметки.

В WHERE date >= $2 AND date < $3

1 Ответ

0 голосов
/ 22 января 2019

XML не позволяет использовать < или > внутри значения тега, если вы не заключите содержимое этого тега в раздел CDATA:

<createProcedure>
 <![CDATA[ 
    CREATE OR REPLACE FUNCTION function(dateFrom timestamp, dateTo timestamp ) 
    RETURNS TABLE
    LANGUAGE plpgsql
    AS $$
    BEGIN
    SELECT * FROM
    ORDER BY date DESC
    WHERE date >= $2 AND date <  $3
    RETURN QUERY;
    END;
    $$;
  ]]> 
</createProcedure>

Не связанный с вопросом Liquibase: функции, заключающие в себе простые запросы SQL, лучше определить как функции SQL, чтобы избежать издержек PL / pgSQL:

<createProcedure>
 <![CDATA[ 
    CREATE OR REPLACE FUNCTION function(dateFrom timestamp, dateTo timestamp ) 
    RETURNS TABLE (...)
    LANGUAGE sql
    AS $$
      SELECT * 
      FROM ...
      WHERE date >= $2 
        AND date <  $3
      ORDER BY date DESC
    $$;
  ]]> 
</createProcedure>
...