2015-05-13 22 views
5

Ho la seguente definizione di funzione per un database PostgreSQL 9.3.4:PostgreSQL definizione di funzione in scoiattolo: non terminata stringa quotata con dollari

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

Quando provo ad eseguire questo a Squirrel (3.5.3 o 3.6) , ottengo il seguente errore:

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

Finora ho imparato questo can be mitigated by using single quotes per delimitare il corpo della funzione in questo modo:

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

Ancora vorrei sapere se questo non può essere risolto altrimenti - Penso che sia possibile dal momento che Flyway può eseguire questo script e utilizza lo stesso driver JDBC configurato in SQuirreL.


Aggiornamento:@a_horse_with_no_name notato che questo errore non ha nulla a che fare con il driver JDBC, ma con il modo SQuirreL analizza l'istruzione SQL e si divide in pezzi prima di inviarli al database. Quindi la domanda rimanente è: Can SQuirreL può inviare una query raw/unparsed? Ho cercato un bel po 'non riuscivo a trovare un modo per farlo.

+0

SQLFiddle ha lo stesso problema, ma il corpo della funzione di virgolette singole non risolve nemmeno il problema. – Patrick

+1

Questo non ha nulla a che fare con il driver JDBC. Immagino che Squirrel non sappia che il testo tra $$ è in realtà una stringa letterale e invia solo la definizione della funzione al primo ';'. Squirrel è in grado di inviare una query senza analizzare il database nel database? Funziona in SQFiddle se usi un delimitatore diverso: http://sqlfiddle.com/#!15/ce3fa3/2 –

risposta

4

È possibile modificare il separatore dichiarazione in modo che la dichiarazione non è diviso su un ;:

Vai a: → SQLDichiarazione separatore sessioneSession Properties

Anche se non è possibile cambiarlo in una stringa vuota, è possibile modificarlo ad esempio su //, che consente l'esecuzione dello stateme nt nella domanda.