Problém nebyl v syntaxi, protože syntaxe perfektně fungovala s flyway nebo přímo v PostgreSQL CLI. Problém byl s Hibernate, konkrétně s parsováním importovaného souboru. Hibernate funguje tak, že spouští každý výraz ze souborů jednotlivě, nikoli celý obsah jako jeden výraz. Snažil jsem se dát všechny definice funkcí na jeden řádek a fungovalo to, ale nebylo to čitelné. Zjistil jsem tedy, že existuje konfigurace pro Hibernate, která říká, že výrazy mohou být víceřádkové, ale $$
oddělovač byl při použití ve více řádcích stále nerozpoznaný.
Řešením tedy bylo definovat příkaz pomocí '
oddělovač a poté v případě potřeby uvozovky ukončete dalším '
.
Řešením je nastavit spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor
použít org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
. MultipleLinesSqlCommandExtractor extrahuje výraz SQL z více řádků a zastaví se, když je přítomen středník. To je konec výrazu. Zabalením těla funkce do řetězce s jednou uvozovkou bude Hibernate považovat toto zalamování za jeden řádek.
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();
Vždy musím mít na paměti, abych unikal jednoduchým uvozovkám ve výrazech, ale nyní mohu mít pro člověka čitelnější počáteční soubor.