2015-05-13 24 views
5

Ich habe folgende Funktionsdefinition für eine PostgreSQL 9.3.4 Datenbank:PostgreSQL Funktionsdefinition in SQuirreL: ungekündigten Dollar-Zeichenfolge in Anführungszeichen

CREATE OR REPLACE FUNCTION update_modified_timestamp() 
RETURNS TRIGGER AS $$ 
    BEGIN 
    NEW.modified_at = now(); 
    RETURN NEW; 
    END; 
$$ LANGUAGE plpgsql; 

Wenn ich versuche, dies in SQuirreL auszuführen (3.5.3 oder 3.6) , bekomme ich folgende Fehlermeldung:

Error: ERROR: unterminated dollar-quoted string at or near "$$ 
BEGIN 
    NEW.modified_at = now()" 
    Position: 77 
SQLState: 42601 
ErrorCode: 0 

Bisher habe ich diesen can be mitigated by using single quotes gelernt, wie so die Funktion Körper abgrenzen:

CREATE OR REPLACE FUNCTION update_modified_timestamp() 
RETURNS TRIGGER AS ' 
    BEGIN 
    NEW.modified_at = now(); 
    RETURN NEW; 
    END; 
' LANGUAGE plpgsql; 

Noch möchte ich wissen, ob das nicht anders gelöst werden kann - ich denke es muss möglich sein, da Flyway dieses Skript ausführen kann und es verwendet genau den gleichen JDBC-Treiber, der in SQuirreL konfiguriert ist.


Update:@a_horse_with_no_name stellte fest, dass dieser Fehler nichts mit den JDBC-Treiber zu tun hat, sondern mit wie SQuirreL die SQL-Anweisung analysiert und teilt sie in Stücke, bevor sie in die Datenbank zu senden. Die verbleibende Frage lautet also: Kann SQuirreL eine Abfrage raw/unparsed senden? Ich habe ziemlich viel gesucht, konnte keinen Weg finden, das zu tun.

+0

SQLFiddle hat das gleiche Problem, aber dort die einzige Anführungszeichen Funktion Körper nicht einmal das Problem zu lösen. – Patrick

+1

Das hat nichts mit dem JDBC-Treiber zu tun. Ich nehme an, dass Squirrel nicht weiß, dass der Text zwischen $$ tatsächlich ein String-Literal ist und nur die Funktionsdefinition bis zum ersten ';' sendet. Ist Squirrel in der Lage, eine Abfrage ohne Analyse an die Datenbank zu senden? Es funktioniert in SQFiddle, wenn Sie ein anderes Trennzeichen verwenden: http://sqlfiddle.com/#!15/ce3fa3/2 –

Antwort

4

Sie können die Anweisung Separator ändern, so die Aussage nicht auf einem ; aufgeteilt:

Gehe zu: SessionSitzungseigenschaftenSQLStatement Separator

Obwohl Sie können es nicht in eine leere Zeichenfolge ändern, Sie können es beispielsweise in // ändern, was die Ausführung des Statements ermöglicht nt in der Frage.