Te znaki dolara ($$
) są używane do cytowania dolara , który w żaden sposób nie jest specyficzny dla definicji funkcji . Może być używany do zastępowania pojedynczych cudzysłowów zawierających literały łańcuchowe (stałe) w dowolnym miejscu w skryptach SQL.
Tak się składa, że ciało funkcji jest takim literałem ciągu. Cytowanie w dolarach jest specyficznym dla PostgreSQL substytutem pojedynczych cudzysłowów, aby uniknąć unikania zagnieżdżonych pojedynczych cudzysłowów (rekursywnie). Równie dobrze możesz ująć treść funkcji w pojedynczych cudzysłowach. Ale wtedy musiałbyś uciec od wszystkich pojedynczych cudzysłowów w ciele:
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
';
To nie jest dobry pomysł. Zamiast tego użyj cytowania w dolarach. Dokładniej, umieść również token między $$
aby każda para była unikalna — możesz użyć zagnieżdżonych cudzysłowów w treści funkcji. Właściwie to robię to bardzo często.
CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean
LANGUAGE plpgsql STRICT IMMUTABLE AS
$func$
BEGIN
...
END
$func$;
Zobacz:
- Wstaw tekst z pojedynczymi cudzysłowami w PostgreSQL
Jeśli chodzi o twoje drugie pytanie:
Przeczytaj najdoskonalszy podręcznik na temat CREATE FUNCTION
aby zrozumieć ostatnią linijkę twojego przykładu.