createProcedure 中的 Liquibase 标记错误

Liquibase markup error in createProcedure

我正在使用 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 >=  AND date <  
        RETURN QUERY;
        END;
        $$;
     </createProcedure>

错误:

The content of elements must consist of well-formed character data or markup.

WHERE date >= AND date <

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 >=  AND date <  
    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 >=  
        AND date <  
      ORDER BY date DESC
    $$;
  ]]> 
</createProcedure>