2012-08-27 9 views
53

völlig neue Sein PL/pgSQL, was ist der Sinn des doppelten Dollarzeichen in this function:

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; 

Ich vermute, dass in RETURNS boolean AS $$, $$ ist ein Platzhalter.

Die letzte Zeile ist ein bisschen ein Rätsel: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

By the way, was ist die letzte Zeile bedeuten?

+3

Bitte erwägen Sie, Erwin Antwort als Antwort auf diese Frage zu markieren, seine Beschreibung erklärt, was tatsächlich '$$' ist und Sie können etwas neues lernen, indem Sie es z.B. da gibt es auch '$ foo $' – csharpfolk

Antwort

72

Die Dollarzeichen werden für dollar quoting verwendet und sind in keiner Weise spezifisch für Funktionsdefinitionen. Es kann verwendet werden, um einzelne Anführungszeichen praktisch überall in SQL-Skripten zu ersetzen.

Der Rumpf einer Funktion ist zufällig ein String-Literal, das in einfache Anführungszeichen eingeschlossen werden muss. Dollar-Quoting ist ein PostgreSQL-spezifischer Ersatz für einfache Anführungszeichen, um das Zitieren von Problemen innerhalb des Funktionskörpers zu vermeiden. Sie könnten Ihre Funktionsdefinition auch mit einfachen Anführungszeichen schreiben. Aber dann müssten Sie alle einfachen Anführungszeichen im Körper entkommen:

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; 

Das ist nicht so eine gute Idee. Verwenden Sie stattdessen dollar-quoting, setzen Sie genauer gesagt auch ein Token zwischen die $$, um es einzigartig zu machen - Sie könnten $ -quotes auch innerhalb des Funktionskörpers verwenden. Das mache ich eigentlich sehr.

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

Details:

Zu Ihrer zweiten Frage:
Lesen Sie die trefflichsten manual on CREATE FUNCTION die letzte Zeile von Ihrem Beispiel zu verstehen.

+1

Du sollst sagen * feines Handbuch *, RTEM hat einfach nicht den richtigen Ring dazu :) –

+0

@muistooshort: Mein böser, versuch eine Variation des Themas scheint kaputt zu sein die Harmonie. Wie gefällt Ihnen RTMEM? :) –

+1

Ich versuchte es zu schreien und es war einfach nicht das Gleiche.Es gibt jedoch Situationen, in denen Höflichkeit zählt. –

17

Das $$ ist ein Trennzeichen, mit dem Sie angeben können, wo die Funktionsdefinition beginnt und endet. Betrachten Sie die folgende,

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

Die Funktion erstellen Syntax ist ähnlich, aber weil Sie alle Arten von SQL in Ihrer Funktion verwenden werden (vor allem Ende Aussage, Charakter), würde Reise der Parser, wenn Sie didn‘ t es abgrenzen. So sollten Sie Ihre Aussage lesen als:

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

Der Stoff nach der eigentlichen Definition Optionen sind die Datenbank mehr Informationen über Ihre Funktion zu geben, so kann es seine Nutzung optimieren.

In der Tat, wenn Sie unter "4.1.2.2. Dollar-Quoted String Konstanten" im Handbuch schauen, werden Sie sehen, dass Sie sogar Zeichen zwischen den Dollar-Symbolen verwenden können und es wird alle als ein Trennzeichen zählen.