2015-05-13 2 views
5

У меня есть следующее определение функции для базы данных PostgreSQL 9.3.4:PostgreSQL определение функции в Squirrel: незавершенная доллар кавычках

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

Когда я пытаюсь выполнить это в беличьих (3.5.3 или 3.6) , я получаю следующее сообщение об ошибке:

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

до сих пор я узнал эту can be mitigated by using single quotes, чтобы разграничить функции тела, как так:

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

Еще я хотел бы знать, если это невозможно решить иначе - я думаю, это должно быть возможно, так как Flyway может выполнить этот скрипт и использует тот же самый JDBC-драйвер, который настроен в SQuirreL.


Update:@a_horse_with_no_name отметил, что эта ошибка не имеет ничего общего с драйвером JDBC, но с тем, как SQuirreL разбирает оператор SQL и разбивает его на куски, прежде чем отправить их в базу данных. Таким образом, оставшийся вопрос: Может ли SQuirreL отправить запрос raw/unparsed? Я искал совсем немного, не мог найти способ сделать это.

+0

SQLFiddle имеет ту же проблему, но там единственное тело функции кавычек даже не решает проблему. – Patrick

+1

Это не имеет никакого отношения к драйверу JDBC. Я думаю, что Squirrel не знает, что текст между $$ на самом деле является строковым литералом и отправляет только определение функции до первого ';'. Может ли Squirrel отправлять запрос _without parsing it_ в базу данных? Он работает в SQFiddle, если вы используете другой разделитель: http://sqlfiddle.com/#!15/ce3fa3/2 –

ответ

4

Вы можете изменить разделитель заявление поэтому заявление не расщепляется на ;:

Перейти к: SessionСвойства сеансаSQLStatement Сепаратор

Несмотря на то, вы не можете изменить его на пустую строку, вы можете изменить ее, например, на //, что позволяет выполнять stateme nt в вопросе.