Cosa si intende per ‘$$’ in PL / pgSQL

Essendo completamente nuovo in PL / pgSQL, qual è il significato di doppio simbolo del dollaro in questa funzione :

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; 

Suppongo che, in RETURNS boolean AS $$ , $$ sia un segnaposto.

L’ultima riga è un po ‘misteriosa: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

A proposito, cosa significa l’ultima riga?

I simboli del dollaro vengono utilizzati per la quotazione in dollari e non sono in alcun modo specifici per le definizioni di funzione . Può essere utilizzato per sostituire le virgolette singole praticamente ovunque negli script SQL.

Il corpo di una funzione sembra essere una stringa letterale che deve essere racchiusa tra virgolette singole. La quotazione in dollari è un sostituto specifico di PostgreSQL per le virgolette singole per evitare di citare problemi all’interno del corpo della funzione. Puoi anche scrivere la definizione della tua funzione con le virgolette singole. Ma allora dovresti sfuggire a tutte le virgolette singole nel corpo:

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

Questa non è una buona idea. Usa invece le quotazioni in dollari, in particolare metti anche un gettone tra $$ per renderlo unico – potresti anche voler usare $ -quotes all’interno del corpo della funzione. Lo faccio molto, in realtà.

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

Dettagli:

  • Inserisci il testo con virgolette singole in PostgreSQL

Per quanto riguarda la tua seconda domanda:
Leggi il manuale più eccellente su CREATE FUNCTION per comprendere l’ultima riga del tuo esempio.

Il $$ è un delimitatore che si usa per indicare dove inizia e termina la definizione della funzione. Considera quanto segue,

 CREATE TABLE    

La syntax della funzione di creazione è simile, ma poiché utilizzerai tutti i tipi di SQL nella tua funzione (in particolare la fine dell’istruzione, il carattere), il parser scatterà se non lo hai delimitato. Quindi dovresti leggere la tua dichiarazione come:

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

Le cose dopo la definizione effettiva sono opzioni per dare al database maggiori informazioni sulla tua funzione, in modo che possa ottimizzare il suo utilizzo.

Infatti, se si guarda in "4.1.2.2. Costanti stringa quotate in dollari" nel manuale, si vedrà che è ansible utilizzare anche caratteri tra i simboli del dollaro e che saranno tutti conteggiati come un delimitatore.