問題は構文ではありませんでした。構文はflywayで完全に機能していたか、PostgreSQLCLIで直接機能していたためです。問題はHibernateにあり、特にインポートファイルの解析にありました。 Hibernateが機能する方法は、コンテンツ全体を単一の式としてではなく、ファイルから各式を個別に実行することです。すべての関数定義を1行にまとめようとしましたが、機能しましたが、読み取れませんでした。そのため、式を複数行にすることができることをHibernateに通知するための構成があることがわかりましたが、$$
複数行で使用した場合、区切り文字はまだ認識されませんでした。
したがって、解決策は'
を使用してコマンドを定義することでした。 区切り文字を入力し、必要に応じて追加の'
で一重引用符をエスケープします 。
解決策は、spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor
を設定することです。 org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
を使用するには 。 MultipleLinesSqlCommandExtractorは、複数の行からSQL式を抽出し、セミコロンが存在する場合に停止します。これで式は終わりです。関数の本体を一重引用符で囲む文字列でラップすることにより、Hibernateはそのラップを1行として扱います。
data.sql
CREATE OR REPLACE FUNCTION insert_timeout_configuration() RETURNS bigint AS '
DECLARE created_id bigint;
BEGIN
INSERT INTO timeout_configuration (id, version, timeout)
VALUES (nextval(''my_sequence''), 0, 300)
RETURNING id INTO created_id;
return created_id;
END;
' language plpgsql;
CREATE OR REPLACE FUNCTION insert_url_configuration() RETURNS bigint AS '
DECLARE created_id bigint;
BEGIN
INSERT INTO url_configuration (id, version, my_url)
VALUES (nextval(''my_sequence''), 0,''http://localhost:8080/'')
RETURNING id INTO created_id;
return created_id;
END;
' language plpgsql;
DO '
INSERT INTO global_configuration(id, version, name, timeout_configuration_id, url_configuration_id)
VALUES (nextval(''my_sequence''), 0, ''My global config'', insert_timeout_configuration(), insert_url_configuration());
-- do some other code
END
';
drop function insert_timeout_configuration();
drop function insert_url_configuration();
式の単一引用符をエスケープすることを常に念頭に置く必要がありますが、今ではより人間が読めるシードファイルを作成できます。