'$$' được sử dụng để làm gì trong PL / pgSQL


93

Là hoàn toàn mới đối với PL / pgSQL, ý nghĩa của dấu hiệu đô la kép trong hàm này là gì :

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS $$
BEGIN
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';
  END IF;
  RETURN true; 
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;

Tôi đoán rằng, trong RETURNS boolean AS $$, $$là một trình giữ chỗ.

Dòng cuối cùng là một chút bí ẩn: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

Nhân tiện, dòng cuối cùng có nghĩa là gì?


4
Vui lòng xem xét đánh dấu câu trả lời Erwin là câu trả lời cho câu hỏi này, mô tả ông giải thích những gì thực sự đang $$và bạn có thể học hỏi những điều mới mẻ bằng cách đọc nó ví dụ như cũng có$foo$
csharpfolk

Câu trả lời:


135

Các ký hiệu đô la được sử dụng để báo giá đô lakhông có cách nào cụ thể cho các định nghĩa chức năng . Nó có thể được sử dụng để thay thế các dấu ngoặc kép thực tế ở bất kỳ đâu trong các tập lệnh SQL.

Phần thân của một hàm là một chuỗi ký tự phải được đặt trong dấu ngoặc kép. Báo giá đô la là một sự thay thế cụ thể cho PostgreSQL cho các dấu ngoặc kép đơn lẻ để tránh các vấn đề trích dẫn bên trong thân hàm. Bạn cũng có thể viết định nghĩa hàm của mình bằng dấu ngoặc đơn. Nhưng sau đó bạn phải thoát khỏi tất cả các dấu ngoặc kép trong phần nội dung:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS
'
BEGIN
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';
  END IF;
  RETURN true; 
END
' LANGUAGE plpgsql STRICT IMMUTABLE;

Đây không phải là một ý kiến ​​hay. Thay vào đó, hãy sử dụng báo giá đô la, đặc biệt hơn cũng đặt một mã thông báo giữa $$để làm cho nó trở nên duy nhất - bạn cũng có thể muốn sử dụng $ -quotes bên trong nội dung hàm. Tôi làm điều đó rất nhiều, thực sự.

CREATE OR REPLACE FUNCTION check_phone_number(text)
  RETURNS boolean  
AS
$func$
BEGIN
 ...
END
$func$  LANGUAGE plpgsql STRICT IMMUTABLE;

Chi tiết:

Đối với câu hỏi thứ hai của bạn:
Đọc hướng dẫnCREATE FUNCTION tuyệt vời nhất để hiểu dòng cuối cùng của ví dụ của bạn.


1
Bạn đang nghĩ để nói tốt thủ công , RTEM chỉ không có chiếc nhẫn quyền nó :)
mu quá ngắn

@muistooshort: Thật tệ, việc thử một biến thể về chủ đề dường như đã phá vỡ sự hài hòa. Bạn thích RTMEM như thế nào? :)
Erwin Brandstetter

1
Tôi đã cố gắng la nó và nó không giống nhau. Mặc dù, có một số tình huống mà sự lịch sự được coi là quan trọng.
mu quá ngắn

@ErwinBrandstetter Được rồi, nhưng là $body$gì? Từ CREATE OR REPLACE FUNCTION update_ts() RETURNS TRIGGER AS $BODY$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $BODY$ LANGUAGE plpgsql- tôi không thấy bodyđịnh nghĩa ở bất cứ đâu. Tôi thực sự không biết chuyện gì đang xảy ra ở đây
Growler

2
@Growler: $body$chỉ là "báo giá đô la", như tôi đã giải thích. Thêm chi tiết: stackoverflow.com/a/12320729/939860
Erwin Brandstetter

21

$$ là một dấu phân cách bạn sử dụng để cho biết vị trí bắt đầu và kết thúc của định nghĩa hàm. Hãy xem xét những điều sau đây,

CREATE TABLE <name> <definition goes here> <options go here, eg: WITH OIDS>

Cú pháp của hàm tạo cũng tương tự, nhưng vì bạn sẽ sử dụng tất cả các loại SQL trong hàm của mình (đặc biệt là phần cuối của câu lệnh; ký tự), trình phân tích cú pháp sẽ ngắt nếu bạn không phân tách nó. Vì vậy, bạn nên đọc tuyên bố của mình là:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS <code delimited by $$> LANGUAGE plpgsql STRICT IMMUTABLE;

Những thứ sau định nghĩa thực tế là các tùy chọn để cung cấp cho cơ sở dữ liệu thêm thông tin về chức năng của bạn, vì vậy nó có thể tối ưu hóa việc sử dụng.

Trên thực tế, nếu bạn nhìn vào "4.1.2.2. Hằng số chuỗi được trích dẫn bằng đô la" trong sách hướng dẫn, bạn sẽ thấy rằng bạn thậm chí có thể sử dụng các ký tự ở giữa các ký hiệu đô la và tất cả sẽ được tính là một dấu phân cách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.