由于我需要在 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 片段。
最好的, 吉娜
为了创建类似于 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>