2013-11-25 6 views
5

Nun, das ist etwas seltsam, könnte mir jemand helfen, darauf hinzuweisen, wo diese Funktion falsch sein könnte. Ich habe eine ähnliche Funktion wiePostgres-Migrationsfehler; nicht abgeschlossene Dollar-notierte Zeichenfolge

CREATE FUNCTION check_password(uname TEXT, pass TEXT) 
RETURNS BOOLEAN AS $$ 
DECLARE passed BOOLEAN; 
BEGIN 
     SELECT (pwd = $2) INTO passed 
     FROM pwds 
     WHERE username = $1; 

     RETURN passed; 
END; 

$$ LANGUAGE plpgsql 

Wenn ich es direkt in der Konsole pgAdmin SQL laufen, keine Fehler vorhanden sind, aber es in einer Migration Skript db-Migration-Maven-Plugin i den Fehler ausgeführt wird.

Error executing: CREATE FUNCTION check_password(uname TEXT, pass TEXT) 
       RETURNS BOOLEAN AS $$ DECLARE passed BOOLEAN 
org.postgresql.util.PSQLException: ERROR: unterminated dollar-quoted 
         string at or near "$$ DECLARE passed BOOLEAN" 
Position: 74 
+0

Sorry, vor dem gleichen Problem jetzt. Hast du den Weg gefunden, es zu reparieren? –

+1

Ich vermied es lange zusammen zu schreiben. Es ist ein Problem mit der Migrationssoftware (Carbonfive). Ich dachte daran, ein paar Änderungen daran vorzunehmen, da es sich um eine OpenSource handelt, aber keine Zeit dafür hat. – ivanorone

+0

Ich habe eine ähnliche Fehlermeldung mit Aqua Data Studio, das den Redshift JDBC-Treiber verwendet. In meinem Fall war die Lösung, zu "Optionen" zu wechseln und das Häkchen zu entfernen; Anweisungstrennzeichen '. Es scheint, dass der Parser angenommen hat, dass das erste Semikolon das Ende der gesamten Funktionsdefinition war, und dass es das schließende $$ noch nicht gesehen hatte. Ihre Beispielfunktion wurde ohne Fehler auf meinem System (Version 9.5) erstellt, wenn diese Box nicht angekreuzt wurde. Mit dem '; Statement Separator 'angekreuzt, ich habe den gleichen Fehler bekommen. Hoffe, dass hilft. – Jason

Antwort

2

Die durch Migration Skripte generiert SQL wahrscheinlich eine Art von $$ Anführungszeichen in ihnen haben, die irgendwo als String interpretiert wird.

Eine schnelle und dreckige Lösung könnte sein, $$ zu $func$ oder sogar $check_password$ zu ändern, obwohl es möglicherweise andere Funktionen weiter unten gibt, die das gleiche Problem erleiden.

Der bessere, langfristigere Ansatz wird sein, die problematische $$ zu lokalisieren.

+0

dachte ich zuerst, änderte $$ zu $ ​​func $, aber immer noch das half nie – ivanorone

+0

@ivan_d_coder: es scheiterte mit der genau gleichen Fehlermeldung, oder an einem anderen Ort? –

+0

der gleiche Ort und der gleiche Fehler :) – ivanorone

2

@ivanorone: Es gibt einen Fehler für db-migration-maven-plugin: https://code.google.com/p/c5-db-migration/issues/detail?id=9 Es ist ein Patch enthalten, aber mit Blick auf seine Quelle, es nicht wirklich das Problem richtig beheben. Außerdem scheint das Projekt im Leerlauf zu sein (Last Commit 2010).

Es gibt ein anderes Plugin, das ich versuche, stattdessen zu verwenden, Flyway: http://flywaydb.org/ Der Wechsel war ziemlich einfach und es funktioniert gut bis jetzt.

+1

Ich stimme zu, scheint Flywaydb aktiver als Carbon5 b-Migration-Maven-Plugin. Ich hatte es nicht ernst genommen, werde es aber bald ansehen – ivanorone

0

Lösung für Grails Database Migration Plugin

changeSet(author: "...", id: "...") { 
    sql(splitStatements: false, ''' 
     CREATE FUNCTION trigger_func() RETURNS TRIGGER AS $$ 
     DECLARE var text; 
     BEGIN 
     ... 
     END $$ LANGUAGE plpgsql; 
    ''') 
} 
0

Führen Sie Ihre Abfrage als einzelne Charge (Hinweis: Verwenden Sie Strg + F5) .Wenn ich Ihre Frage in Postgres SQl (Greenplum Interface) lief ich similiar Fehler bekam wie u oben angegeben. Ich habe festgestellt, dass db die Abfrage ausführt, indem sie sie basierend auf der Beendigung in unserer Abfrage (Semikolon) aufteilt. Da wir Sie in Ihrer Anfrage dreimal beendet haben, führt es eine Anweisung nacheinander aus. Um es als einen ganzen Stapel auszuführen, führen Sie es so aus, dass Sie in der Ausführungsoption als einzelner Stapel ausführen ausführen.

Ich hoffe es hilft dir :) :)