Het probleem was niet de syntaxis, omdat de syntaxis perfect werkte met flyway of rechtstreeks in PostgreSQL CLI. Het probleem was met Hibernate, met name met het ontleden van het importbestand. De manier waarop Hibernate werkt, is dat het elke expressie uit de bestanden afzonderlijk uitvoert, niet de hele inhoud als een enkele expressie. Ik heb geprobeerd alle functiedefinities op één regel te zetten en het werkte, maar het was niet leesbaar. Dus ik ontdekte dat er een configuratie voor Hibernate is om aan te geven dat expressies meerdere regels kunnen hebben, maar de $$
scheidingsteken werd nog steeds niet herkend bij gebruik in meerdere regels.
Dus de oplossing was om het commando te definiëren met '
scheidingsteken en escape de enkele aanhalingstekens waar nodig met een extra '
.
De oplossing is om de spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor
in te stellen om org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
te gebruiken . MultipleLinesSqlCommandExtractor extraheert de SQL-expressie uit meerdere regels en stopt wanneer een puntkomma aanwezig is. Dat is het einde van de uitdrukking. Door de hoofdtekst van de functie in een tekenreeks met enkele aanhalingstekens te wikkelen, behandelt Hibernate die omloop als een enkele regel.
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();
Ik moet altijd in gedachten houden dat ik aan de enkele aanhalingstekens in de uitdrukkingen moet ontsnappen, maar nu kan ik een meer voor mensen leesbaar seed-bestand hebben.