You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Ich versuche, mit dem SqlExecutor folgende Funktion anzulegen:
CREATE OR REPLACE FUNCTION ${dbSchema}.lastchange() RETURNS trigger AS $$
BEGIN
NEW.t_lastchange := current_timestamp;
NEW.t_user := session_user;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Dies schlägt fehl mit der Meldung: java.sql.SQLException: Error while executing the sqlstatement. ERROR: syntax error at or near "$"
Am PostgreSQL-DB-Server kommt hierbei folgende Query an:
CREATE OR REPLACE FUNCTION arp_agglomerationsprogramme_v1.lastchange() RETURNS trigger AS $ BEGIN NEW.t_lastchange := current_timestamp
Also andere Variante, die Funktion zu formulieren:
CREATE OR REPLACE FUNCTION ${dbSchema}.lastchange() RETURNS trigger AS $foo$
BEGIN
NEW.t_lastchange := current_timestamp;
NEW.t_user := session_user;
RETURN NEW;
END;
$foo$ LANGUAGE plpgsql;
So schlägt der SqlExecutor ebenfalls fehl mit der Meldung: java.sql.SQLException: Error while executing the sqlstatement. Unterminated dollar quote started at position 90 in SQL CREATE OR REPLACE FUNCTION arp_agglomerationsprogramme_v1.lastchange() RETURNS trigger AS $foo$ BEGIN NEW.t_lastchange := current_timestamp. Expected terminating $$
Die Query wird in diesem Fall gar nicht erst an den DB-Server gesendet.
Nochmal andere Variante, die Funktion zu schreiben (mit Hochkommas statt Dollar Quoting):
CREATE OR REPLACE FUNCTION ${dbSchema}.lastchange() RETURNS trigger AS
'BEGIN
NEW.t_lastchange := current_timestamp;
NEW.t_user := session_user;
RETURN NEW;
END;'
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION ${dbSchema}.lastchange() RETURNS trigger AS ${dollarQuoting}
BEGIN
NEW.t_lastchange := current_timestamp;
NEW.t_user := session_user;
RETURN NEW;
END;
${dollarQuoting} LANGUAGE plpgsql;
Wobei ich als Parameter zusätzlich dollarQuoting: '$$' übergeben habe.
Dies scheitert mit der Meldung wie im zweiten Fall von oben: java.sql.SQLException: Error while executing the sqlstatement. Unterminated dollar quote started at position 90 in SQL CREATE OR REPLACE FUNCTION arp_agglomerationsprogramme_v1.lastchange() RETURNS trigger AS $$ BEGIN NEW.t_lastchange := current_timestamp. Expected terminating $$
Die Query wird in diesem Fall ebenfalls gar nicht an den DB-Server gesendet.
Das Problem ist wohl (nach etwas Recherche), dass der SQL-Parser nicht kapiert, dass das erste Semikolon innerhalb der Funktionsdefinition nicht der Abschluss des gesamten SQL-Statements ist, sondern dass es nur diesen einen plpgsql-Befehl abschliesst. Quelle: https://stackoverflow.com/q/30211053 (zweiter Kommentar)
Ich versuche, mit dem SqlExecutor folgende Funktion anzulegen:
Dies schlägt fehl mit der Meldung:
java.sql.SQLException: Error while executing the sqlstatement. ERROR: syntax error at or near "$"
Am PostgreSQL-DB-Server kommt hierbei folgende Query an:
Also andere Variante, die Funktion zu formulieren:
So schlägt der SqlExecutor ebenfalls fehl mit der Meldung:
java.sql.SQLException: Error while executing the sqlstatement. Unterminated dollar quote started at position 90 in SQL CREATE OR REPLACE FUNCTION arp_agglomerationsprogramme_v1.lastchange() RETURNS trigger AS $foo$ BEGIN NEW.t_lastchange := current_timestamp. Expected terminating $$
Die Query wird in diesem Fall gar nicht erst an den DB-Server gesendet.
Nochmal andere Variante, die Funktion zu schreiben (mit Hochkommas statt Dollar Quoting):
Dies funktioniert. Es hat allerdings den Nachteil, dass komplizierterer Funktionsinhalt wegen dem dann notwendigen Escapen von Anführungszeichen sehr unübersichtlich wird. (Beispiele siehe https://www.postgresql.org/docs/15/plpgsql-development-tips.html#PLPGSQL-QUOTE-TIPS.) Die bessere Variante wäre also das Dollar Quoting.
Mein Feature Request ist deshalb, dass GRETL dies falls möglich erlauben würde, zumindest den ersten Fall.
The text was updated successfully, but these errors were encountered: