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 đó.
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
Đ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 –