2015-05-13 13 views
5

Tôi có định nghĩa hàm sau cho một cơ sở dữ liệu PostgreSQL 9.3.4:PostgreSQL định nghĩa hàm trong SquirreL: unterminated đô la trích dẫn chuỗi

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

Khi tôi cố gắng thực hiện điều này trong SquirreL (3.5.3 hoặc 3.6) , tôi nhận được lỗi sau:

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

cho đến nay tôi đã học được can be mitigated by using single quotes này để phân định các cơ quan chức năng như vậy:

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

Tuy nhiên tôi muốn biết nếu điều này không thể giải quyết được - Tôi nghĩ rằng nó phải có thể vì Flyway có thể thực thi tập lệnh này và nó sử dụng trình điều khiển JDBC giống hệt được cấu hình trong SQuirreL.


Cập nhật:@a_horse_with_no_name lưu ý rằng lỗi này không có gì để làm với các trình điều khiển JDBC, nhưng với cách SquirreL phân tích các câu lệnh SQL và chia nó thành nhiều phần trước khi gửi chúng đến cơ sở dữ liệu. Vì vậy, câu hỏi còn lại là: SquirreL có thể gửi truy vấn thô/chưa được phân bổ không? Tôi đã tìm kiếm khá một chút không thể tìm thấy cách để làm điều đó.

+0

SQLFiddle có cùng một vấn đề, nhưng có phần thân hàm báo giá đơn lẻ thậm chí không giải quyết được sự cố. – Patrick

+1

Điều này không liên quan gì đến trình điều khiển JDBC. Tôi đoán Squirrel không biết rằng văn bản giữa $$ thực sự là một chuỗi ký tự và chỉ gửi định nghĩa hàm lên đến ';' đầu tiên. Squirrel có thể gửi một truy vấn _without phân tích cú pháp it_ đến cơ sở dữ liệu không? Nó hoạt động trong SQFiddle nếu bạn sử dụng một dấu phân cách khác nhau: http://sqlfiddle.com/#!15/ce3fa3/2 –

Trả lời

4

Bạn có thể thay đổi các dấu phân cách tuyên bố như vậy tuyên bố không chia trên ;:

Go to: phiênphiên Thuộc tínhSQLTuyên Bố Separator

Mặc dù bạn không thể thay đổi nó thành một chuỗi rỗng, bạn có thể thay đổi nó thành ví dụ thành //, cho phép thực thi stateme nt trong câu hỏi.

Các vấn đề liên quan