A quoi servent “$$” dans PL / pgSQL

Étant complètement nouveau dans PL / pgSQL, que signifie les signes de double dollar dans cette fonction :

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 ssortingng "%". Expected format is +999 999'; END IF; RETURN true; END; $$ LANGUAGE plpgsql STRICT IMMUTABLE; 

Je devine que, dans RETURNS boolean AS $$ , $$ est un espace réservé.

La dernière ligne est un peu mystérieuse: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

Au fait, que signifie la dernière ligne?

    Les signes dollar sont utilisés pour les cours du dollar et ne sont en aucun cas spécifiques aux définitions de fonction . Il peut être utilisé pour remplacer des guillemets simples pratiquement n’importe où dans les scripts SQL.

    Le corps d’une fonction se trouve être un littéral de chaîne qui doit être placé entre guillemets simples. La cotation en dollars est un substitut spécifique à PostgreSQL pour les guillemets simples afin d’éviter de citer des problèmes à l’intérieur du corps de la fonction. Vous pourriez aussi bien écrire votre définition de fonction avec des guillemets simples. Mais alors vous devriez échapper à tous les guillemets simples dans le corps:

     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 ssortingng "%". Expected format is +999 999''; END IF; RETURN true; END ' LANGUAGE plpgsql STRICT IMMUTABLE; 

    Ce n’est pas une si bonne idée. Utilisez plutôt des guillemets, et plus spécifiquement, placez un jeton entre le $$ pour le rendre unique – vous voudrez peut-être également utiliser des guillemets dans le corps de la fonction. Je le fais beaucoup, en fait.

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

    Détails:

    • Insérer du texte avec des guillemets simples dans PostgreSQL

    En ce qui concerne votre deuxième question:
    Lisez le manuel le plus excellent sur CREATE FUNCTION pour comprendre la dernière ligne de votre exemple.

    Le $$ est un délimiteur que vous utilisez pour indiquer où la définition de fonction commence et se termine. Considérer ce qui suit,

     CREATE TABLE    

    La syntaxe de la fonction de création est similaire, mais parce que vous allez utiliser toutes sortes de SQL dans votre fonction (en particulier la fin de l’instruction; caractère), l’parsingur se déclenchera si vous ne le délimitez pas. Donc, vous devriez lire votre déclaration comme suit:

     CREATE OR REPLACE FUNCTION check_phone_number(text) RETURNS boolean AS  LANGUAGE plpgsql STRICT IMMUTABLE; 

    Les éléments après la définition réelle sont des options pour donner à la firebase database plus d'informations sur votre fonction, afin d'optimiser son utilisation.

    En fait, si vous regardez sous "4.1.2.2. Constantes de la chaîne de caractères" dans le manuel, vous verrez que vous pouvez même utiliser des caractères entre les symboles dollar et que cela comptera comme un délimiteur.