Ergebnis 1 bis 6 von 6

Thema: JDBC - Problem mit $-quoting in Funktionen

  1. #1
    lord_pretzel ist offline Neuer Benutzer
    Registriert seit
    24.10.2006
    Ort
    Zürich
    Beiträge
    5

    Standard 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
    Geändert von lord_pretzel (24.10.2006 um 10:37 Uhr)

  2. #2
    fristo ist offline Super-Moderator
    Registriert seit
    08.12.2005
    Ort
    Raum Frankfurt/Main
    Beiträge
    668

    Standard

    Hallo lord_pretzel,

    Zitat Zitat von lord_pretzel Beitrag anzeigen
    "CREATE FUNCTION foo() RETURNS BOOLEAN AS
    'BEGIN
    RETURN true;
    END;'
    LANGUAGE 'plpgsql';"

    funktioniert
    so steht es doch auch in der Dokumentation beschrieben!



    Du kannst es aber auch so schreiben:

    Code:
     
    "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

  3. #3
    lord_pretzel ist offline Neuer Benutzer
    Registriert seit
    24.10.2006
    Ort
    Zürich
    Beiträge
    5

    Standard

    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.

  4. #4
    fristo ist offline Super-Moderator
    Registriert seit
    08.12.2005
    Ort
    Raum Frankfurt/Main
    Beiträge
    668

    Standard

    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:

    Code:
    CREATE FUNCTION t1_count(integer, integer) RETURNS integer AS $$
    
    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 >= \$1 AND num <= \$2" \ [ list int4 int4 ] ] } spi_execp -count 1 $GD(plan) [ list $1 $2 ] return $cnt
    $$ LANGUAGE pltcl;
    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

  5. #5
    lord_pretzel ist offline Neuer Benutzer
    Registriert seit
    24.10.2006
    Ort
    Zürich
    Beiträge
    5

    Standard

    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)
    Geändert von lord_pretzel (25.10.2006 um 10:35 Uhr)

  6. #6
    fristo ist offline Super-Moderator
    Registriert seit
    08.12.2005
    Ort
    Raum Frankfurt/Main
    Beiträge
    668

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 28.02.2012, 10:43
  2. Funktionen in postgresql
    Von tzzdr im Forum SQL
    Antworten: 4
    Letzter Beitrag: 12.10.2011, 14:09
  3. Problem Funktionen exportieren
    Von Hannes23 im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 20.09.2010, 10:47
  4. COPY und Funktionen
    Von beho im Forum SQL
    Antworten: 3
    Letzter Beitrag: 22.11.2007, 13:33
  5. slony Funktionen
    Von MasterEvil im Forum Trigger und Funktionen
    Antworten: 2
    Letzter Beitrag: 29.01.2007, 11:54

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum