PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Do czego służy „$$” w PL/pgSQL?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj zbiór wyników z tablicy SQL na tablicę ciągów

  2. Zmień typ pola varchar na integer:nie można automatycznie rzutować na typ integer

  3. Jak parsować JSON w postgresql

  4. SQL INSERT bez określania kolumn. Co się dzieje?

  5. Obliczanie i oszczędzanie miejsca w PostgreSQL