在liquibase上为H2数据库创建SQL函数

问题描述 投票:0回答:1

由于我需要在 liquibase 中使用 2 个数据库(psql 和 h2),我尝试以不同的方式创建 SQL 函数:

<changeSet author="zina" id="calculate_test">
        <sqlFile            dbms="h2, psql"
                            encoding="UTF-8"
                            endDelimiter="/nGO"
                            path="calculate_test.sql"
                            relativeToChangelogFile="true"
                            splitStatements="false"
                            stripComments="false"/>
    </changeSet>

calculate_test.sql 看起来像

CREATE OR REPLACE FUNCTION calculate()
RETURNS int
BEGIN
RETURN 5;
END;

GO

或者直接在

中使用sql代码
<changeSet author="xxx" id="sql-example">
    <sql dbms="h2"
            endDelimiter="\nGO"
            splitStatements="true"
            stripComments="true">xxx</sql>
</changeSet>

并得到同样的错误。

liquibase.exception.MigrationFailedException: Migration failed for change set migrations.xml::calculate_test::zkensche:
 Reason: liquibase.exception.DatabaseException: Syntax error in SQL statement "CREATE OR 

REPLACE FUNCTION[*] CALCULATE()
RETURNS INT
BEGIN
RETURN 5;
END;

GO"; expected "FORCE, VIEW, ALIAS, SEQUENCE, USER, TRIGGER, ROLE, SCHEMA, CONSTANT, DOMAIN, TYPE, DATATYPE, AGGREGATE, LINKED, MEMORY, CACHED, LOCAL, GLOBAL, TEMP, TEMPORARY, TABLE, SYNONYM, PRIMARY, UNIQUE, HASH, SPATIAL, INDEX"; SQL statement: ...

有人设法在 H2 上创建 SQL 函数吗?还是这是在 Java 上编写 SQL 函数的唯一方法?

根据文档,没有创建CREAT FUNCTION SQL命令。

我将感谢您的评论、解决方法和 Java 片段。

最好的, 吉娜

sql h2 liquibase sql-function
1个回答
0
投票

为了创建类似于 H2 中的函数对象,您需要使用“CREATE ALIAS ...”表达式。该功能基本上是Java代码。

以下是该过程的模型调用示例,应以文本形式返回 JSON:

    CREATE ALIAS gen_pageGlobal AS $$
String nextPrime(String p1, String p2, String p3, String p4) {
    return "{\"type\" : \"page\", \"data\" : {\"rn\": 1, \"email\": \"[email protected]\", \"projectCount\": 6}}";
}
$$;

请记住,为了创建 liquibase,必须设置正确的

endDelimiter = "$$"

<changeSet id="20231219070000-4-2" author="java" context="dev">
    <sql dbms="h2" endDelimiter="$$">
        DROP ALIAS IF EXISTS gen_pageGlobal;
        CREATE ALIAS gen_pageGlobal AS $$
        String nextPrime(String p1, String p2, String p3, String p4) {
            return "{\"data\": []}";
        }
        $$;
    </sql>
</changeSet>
© www.soinside.com 2019 - 2024. All rights reserved.