122 votes

A quoi servent les '$$' dans PL/pgSQL ?

Étant totalement novice en matière de PL/pgSQL, quelle est la signification des doubles signes de dollars 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 substitut.

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

Au fait, que signifie la dernière ligne ?

179voto

Erwin Brandstetter Points 110228

Ces signes de dollar ( $$ ) sont utilisés pour cotation en dollars qui est en aucun cas spécifique aux définitions de fonctions . Il peut être utilisé pour remplacer les guillemets simples entourant les littéraux de chaîne (constantes) n'importe où dans les scripts SQL.

Le corps d'une fonction se trouve être une telle chaîne littérale. Le guillemet anglais est un substitut des guillemets simples spécifique à PostgreSQL pour éviter l'échappement des guillemets simples imbriqués (récursivement). Vous pourriez tout aussi bien mettre le corps de la fonction entre guillemets simples. Mais vous devriez alors échapper tous les guillemets simples dans le corps :

CREATE OR REPLACE FUNCTION check_phone_number(text)
  RETURNS boolean
  LANGUAGE plpgsql STRICT IMMUTABLE 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
';

Ce n'est pas une si bonne idée. Utilisez plutôt le symbole du dollar. Plus précisément, placez également un jeton entre les symboles $$ pour que chaque paire soit unique - vous pouvez utiliser des apostrophes dollar imbriquées dans le corps de la fonction. Je le fais souvent, en fait.

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

Voir :

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

21voto

Captain Coder Points 757

Le $$ est un délimiteur que vous utilisez pour indiquer où commence et où finit la définition de la fonction. Considérez 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 le caractère "end of statement ;"), l'analyseur syntaxique 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 qui suivent la définition proprement dite sont des options destinées à donner à la base de données davantage d'informations sur votre fonction, afin qu'elle puisse en optimiser l'utilisation.

En fait, si vous regardez sous "4.1.2.2. Dollar-Quoted String Constants" 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 seul délimiteur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X