2012-08-27 27 views
53

完全被新向PL/pgSQL是「$$」用途是什麼,什麼是雙美元符號在this function含義:在PL/pgSQL的

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; 

我猜,在RETURNS boolean AS $$$$是一個佔位符。

最後一行是一個有點神祕:$$ LANGUAGE plpgsql STRICT IMMUTABLE;

順便說一句,什麼是最後一行是什麼意思?

+3

請考慮標記Erwin回答作爲這個問題的答案,他的描述解釋了什麼是「$$」,你可以通過閱讀它來學習新東西。還有'$ foo $' – csharpfolk

回答

72

標記用於dollar quoting並且不以任何方式向特定函數的定義美元。它可以用來在幾乎任何地方用SQL腳本替換單引號。

函數的主體恰好是必須用單引號括起來的字符串文字。美元引用是PostgreSQL特定的單引號替換,以避免在函數體內引用問題。你也可以用單引號來編寫你的函數定義。但是,那麼你不得不逃避體內所有的單引號:

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; 

這不是一個好主意。相反,使用美元引用,更具體地說,也可以在$$之間添加一個令牌以使其具有唯一性 - 您也可以在函數體內使用$ -quotes。實際上,我做了很多。

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

詳情:

關於你的第二個問題:
閱讀最優秀的manual on CREATE FUNCTION瞭解你的榜樣的最後一行。

+1

你應該說*精細的手冊*,RTEM只是沒有正確的鈴聲:) –

+0

@ muistooshort:我的壞,試圖在主題上的變化似乎已經破和諧。你如何喜歡RTMEM? :) –

+1

我試過叫它,它只是不一樣。儘管在某些情況下,禮貌是很重要的。 –

17

$$是一個用於指示函數定義開始和結束位置的分隔符。考慮下面,

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

的創建函數的語法是類似的,但因爲你要利用各種SQL在你的功能(尤其是語句的結束;字符),如果你沒解析器會跳閘」 t劃定它。所以,你應該閱讀你的語句:

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

實際定義後的東西是選擇給數據庫有關函數的詳細信息,因此它可以優化其使用。

事實上,如果您在手冊中查看「4.1.2.2。美元引用字符串常量」,您會發現甚至可以在美元符號之間使用字符,並且它們都將被視爲一個分隔符。