Probleme mit $$ Quotes

Um eine komplexe Positionsnumerierung zu realisieren, habe ich mich zum ersten Mal mit PL/pgSQL versucht. Das Formulieren und Ausführen der Funktion hat auch geklappt, wenn ich pgAdmin III verwende.

Da ich das aber in einem Java Projekt mit dbmaintain automatisieren möchte, stört mich die Fehlermeldung die ich bei dbmaintain, aber auch beim Anlegen eines Beispielscripts in der Netbeans bekomme:

CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $a$
BEGIN
    RETURN subtotal * 0.06;
END;
$a$ LANGUAGE plpgsql;

liefert als Fehler:

Error code 0, SQL state 42601: FEHLER: Dollar-Quotes nicht abgeschlossen bei »$a$
BEGIN
    RETURN subtotal * 0.06«
  Position: 58
Line 1, column 1


Executed successfully in 0 s, 0 rows affected.
Line 4, column 1


Error code 0, SQL state 42601: FEHLER: Dollar-Quotes nicht abgeschlossen bei »$a$ LANGUAGE plpgsql«
  Position: 1
Line 5, column 1


Execution finished after 0 s, 2 error(s) occurred.

Ich habe schon viel gegoogelt, aber noch keine Lösung gefunden. Auch umstellen auf eine Zeile zwischen den $$ Quotes hat nicht geholfen.

Danke
Dieter Tremel

Sieht alles gut aus und funktioniert auch bei mir.

Mit was für einem SQL Tool lässt Du das denn laufen?
Vermutlich musst Du dem Tool sagen, dass das alles ein statement ist, und nicht beim ersten ; zu Ende ist

Siehe hier: SQL Fiddle

Ja, das ist richtig, da bin ich dann wahrscheinlich im falschen Forum. Ich verwende die IDE Netbeans 7.3 mit postgresql-9.1-901.jdbc4.jar, und DbMaintain - Index, beide mit dem gleichen Fehlerbild. Weiss derzeit nicht, wo ich da hinfassen muss.

Mercí Dieter

Meines Wissens kann man in dem NetBeans SQL Editor den Delimiter nicht ändern. Vielleicht solltest Du ein anderes Tool für sowas hernehmen.

Bei DbMaint steht ja, dass es den / als Terminator für Oracle’s PL/SQL unterstützt. Vielleicht funktioniert das auch für Postgres.

Ja, da werde ich mich vielleicht mal vertiefen. In dbmaintain sind in z.B. https://dbmaintain.svn.sourceforge.net/svnroot/dbmaintain/tags/releases/dbmaintain-parent-2.4/dbmaintain/src/main/java/org/dbmaintain/script/parser/parsingstate/impl/PostgreSqlPlSqlBlockMatcher.java die Fragestellungen zu mindestens behandelt. Habe aber Dienstag einen Prototyp-Vorführungs-Termin und kann deswegen jetzt nicht tiefer einsteigen.

Netbeans war nur zum Verfassen des Scripts und Testen gedacht. Ich weiß vom Googlen her, dass SquirrelSQL das gleiche Problem hat. pgAdmin parsed offensichtlich besser.

Nochmals Danke
Dieter

Ich nehm’ SQL Workbench/J und da geht’s problemlos: SQL Workbench/J

Vielleicht kannst du auch den kompletten Codeblock (die Funktion) markieren und als einen Befehl ausführen lassen.

Ich habe in Bug 136836 – Allow setting the statement delimiter externally eine Lösung gefunden, die auch in netbeans geht:

delimiter \\
CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $a$
BEGIN
    RETURN subtotal * 0.06;
END;
$a$ LANGUAGE plpgsql\\

Sorry, zu schnell geschossen, das

DELIMITER \\

ist nur ein Netbeans feature, dbmaintain kann das nicht.

Lösung für dbmaintain:

DbMaintain - Tutorial

CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $a$
BEGIN
    RETURN subtotal * 0.06;
END;
$a$ LANGUAGE plpgsql;
/

Das ist doch genau die Stelle die ich in meiner ersten Antwort schon verlinkt hatte…