wake-up-neo.net

Wofür wird '$$' in PL / pgSQL verwendet?

Da PL/pgSQL völlig neu ist, welche Bedeutung haben doppelte Dollarzeichen in diese Funktion :

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 Rätsel: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

Was bedeutet übrigens die letzte Zeile?

80
vector

Die Dollarzeichen werden für Dollar-Anführungszeichen verwendet und sind in keiner Weise spezifisch für die Funktion Definitionen . Es kann verwendet werden, um einfache Anführungszeichen praktisch überall in SQL-Skripten zu ersetzen.

Der Hauptteil einer Funktion ist ein String-Literal, das in einfache Anführungszeichen eingeschlossen werden muss. Dollar-Quoting ist ein PostgreSQL-spezifischer Ersatz für einfache Anführungszeichen, um Quotierungsprobleme innerhalb des Funktionskörpers zu vermeiden. Sie können Ihre Funktionsdefinition auch mit einfachen Anführungszeichen schreiben. Dann müssten Sie jedoch alle einfachen Anführungszeichen im Text umgehen:

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 keine so gute Idee. Verwenden Sie stattdessen Dollar-Anführungszeichen, insbesondere auch ein Token zwischen dem $$, um es eindeutig zu machen - möglicherweise möchten Sie $ -Anführungszeichen auch im Funktionskörper verwenden. Das mache ich eigentlich sehr oft.

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

Einzelheiten:

Zu Ihrer zweiten Frage:
Lies das Hervorragendste Handbuch zu CREATE FUNCTION um die letzte Zeile Ihres Beispiels zu verstehen.

111

Das $$ ist ein Trennzeichen, mit dem Sie angeben, wo die Funktionsdefinition beginnt und endet. Folgendes berücksichtigen,

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

Die Syntax für die Funktion create ist ähnlich, aber da Sie in Ihrer Funktion alle Arten von SQL verwenden (insbesondere das Ende der Anweisung; Zeichen), würde der Parser ausgelöst, wenn Sie ihn nicht einschränken. Sie sollten Ihre Aussage also lesen als:

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

Das Zeug nach der eigentlichen Definition sind Optionen, um der Datenbank mehr Informationen über Ihre Funktion zu geben, damit sie ihre Verwendung optimieren kann.

Wenn Sie im Handbuch unter "4.1.2.2. Dollar-Quoted String Constants" nachsehen, werden Sie feststellen, dass Sie sogar Zeichen zwischen den Dollarsymbolen verwenden können und alles als ein Trennzeichen zählt.

19
Captain Coder