das ich auch $tag$ benutzen kann weiß ich. Deshalb auch mein Beispiel mit $BODY$. Wenn ich das in pgadmin oder psql eingebe funktiert es natürlich auch. Das Problem ist das wenn ich mit jdbc auf die Datenbank zugreife funktioniert $BODY$ nicht.
das mit dem $BODY$ habe ich leider überlesen. Versuch es mal zu escapen.
In der Dokumentation gibt es ein Beispiel für TCL, wo folgendes gemacht wurde:
CREATE FUNCTION t1_count(integer, integer) RETURNS integer AS [color=red][B]$$[/B][/color]
[LEFT]if {![ info exists GD(plan) ]} {
# prepare the saved plan on the first call
set GD(plan) [ spi_prepare \
"SELECT count(*) AS cnt FROM t1 WHERE num >= [color=red][B]\$1[/B][/color] AND num <= \$2" \
[ list int4 int4 ] ]
}
spi_execp -count 1 $GD(plan) [ list $1 $2 ]
return $cnt[/LEFT]
[LEFT][color=red][B]$$[/B][/color] LANGUAGE pltcl;[/LEFT]
Vielleicht hilft es Dir weiter. Wäre gut, wenn Du das Ergebnis mitteilen würdest. Grundsätzlich gilt für die Programmierung der UNIX Style.
also ich habe das Problem zwar noch nicht gelöst, weiß jetzt aber woran es liegt. Wenn ich mit Statement.execute(Sting) einen SQL-Befehl über JDBC an die Datenbank sende wird dieser vom JDBC treiber in einzele Befehle unterteilt.
Beipiel
Statement.execute(“INSERT INTO x VALUES(3); UPDATE test SET name = ‘sdfs’ WHERE id = 3;”);
wird aufgeteilt in
INSERT INTO x VALUES(3);
und
UPDATE test SET name = ‘sdfs’ WHERE id = 3;
Wenn ich jetzt einen CREATE FUNCTION - Befehl mit $-quoting sende, erkennt JBDC das $-quoting nicht als String literal und trennt den CREATE FUNCTION Befehl am ersten “;” was in diesem Befehl auftritt. Das sieht z.B. so aus und erzeugt dann die Fehlermeldung von wegen nicht terminierter $-quote String:
“CREATE FUNCTION foo() RETURNS BOOLEAN AS
$BODY$
BEGIN
RETURN true;”
ERROR: unterminated dollar-quoted string at or near “$BODY$
BEGIN
RETURN true”
Habe versucht die “;” in dem Befehl mit \ zu escapen, aber das klappt auch nicht. Gibt es vielleicht ne Möglichkeit JBDC dazu zu zwingen einen Befehl nicht zu unterteilen? (den commit mit Connection.setAutocommit(false) zu verzögern bringt nichts. der Befehl wird trotzdem aufgeteilt, nur halt erst später commited)