web-dev-qa-db-fra.com

À quoi sert «$$» dans PL / pgSQL

Étant complètement nouveau dans PL/pgSQL, quelle est la signification des signes du 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 string "%". Expected format is +999 999';
  END IF;
  RETURN true; 
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;

Je suppose 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?

80
vector

Les signes dollar sont utilisés pour dollar citation et ne sont en aucun cas spécifiques à la fonction définitions . 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. Dollar-quoting est un substitut spécifique à PostgreSQL pour les guillemets simples pour éviter les problèmes de citation à l'intérieur du corps de la fonction. Vous pouvez également écrire la définition de votre fonction avec des guillemets simples. Mais alors vous devez échapper à toutes 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 string "%". 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, mettez plus spécifiquement un jeton entre le $$ pour le rendre unique - vous pouvez également utiliser $ -quotes dans le corps de la fonction. Je fais beaucoup ça, en fait.

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

Détails:

Quant à votre deuxième question:
Lisez le plus excellent manuel sur CREATE FUNCTION pour comprendre la dernière ligne de votre exemple.

111
Erwin Brandstetter

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 <name> <definition goes here> <options go here, eg: WITH OIDS>

La syntaxe de la fonction de création est similaire, mais comme vous allez utiliser toutes sortes de SQL dans votre fonction (en particulier la fin de l'instruction; caractère), l'analyseur se déclencherait si vous ne le délimitiez pas. Vous devez donc lire votre déclaration comme suit:

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

Les éléments après la définition réelle sont des options pour donner à la base de données plus d'informations sur votre fonction, afin qu'elle puisse optimiser son utilisation.

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

19
Captain Coder