JDBC - Problem mit $-quoting in Funktionen

Hallo allerseits,

ich habe ein Problem mit der Erstellung einer Stored Procedure über JDBC:

Wenn ich in einem Statement $-quoting verwende bekomme ich folgende Fehlermeldung:

ERROR: unterminated dollar-quoted string at or near “$BODY$
DECLARE
id_exists BOOLEAN”

wenn die Funktion als ein String übergeben wird funktioniert es. Muß ich da vielleicht das $-Zeichen escapen?

Beispiel

“CREATE FUNCTION foo() RETURNS BOOLEAN AS
$BODY$
BEGIN
RETURN true;
END;
$BODY$
LANGUAGE ‘plpgsql’;”

funktioniert net.

“CREATE FUNCTION foo() RETURNS BOOLEAN AS
‘BEGIN
RETURN true;
END;’
LANGUAGE ‘plpgsql’;”

funktioniert

Hallo lord_pretzel,

so steht es doch auch in der Dokumentation beschrieben!



Du kannst es aber auch so schreiben:

 
"CREATE FUNCTION foo() RETURNS BOOLEAN AS
$BODY$
  BEGIN
    RETURN true;
  END;
$BODY$
 
LANGUAGE 'plpgsql';"

Vorteil: keine Probleme mit doppelten '-Zeichen, wenn Stringkonstante in der Funktion verarbeitet werden.



mfg

fristo

Hallo fristo,

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.

Hallo lord_pretzel,

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.



mfg

fristo

Hallo fristo,

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)

Hallo lord_pretzel,

die Lösung: JDBC kann es nicht!

Hier einige Links:
http://archives.postgresql.org/pgsql-jdbc/2005-05/msg00090.php
http://archives.postgresql.org/pgsql-jdbc/2005-05/msg00091.php
http://archives.postgresql.org/pgsql-jdbc/2004-09/msg00062.php



mfg

fristo