PL / pgSQL'de '$$' ne için kullanılır?


100

PL / pgSQL için tamamen yeni olduğundan, bu işlevdeki çift ​​dolar işaretlerinin anlamı nedir :

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;

Sanırım içinde RETURNS boolean AS $$, $$bir yer tutucu.

Son satır biraz muamma: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

Bu arada, son satır ne anlama geliyor?


4
Lütfen Erwin'in yanıtını bu soruya yanıt olarak işaretlemeyi düşünün, onun açıklaması gerçekte ne olduğunu açıklıyor $$ve onu okuyarak yeni bir şey öğrenebilirsiniz, örneğin, ayrıca var$foo$
csharpfolk

Yanıtlar:


144

Dolar işaretleri, dolar kotasyonu için kullanılır ve hiçbir şekilde işlev tanımlarına özgü değildir . SQL betiklerinde tek tırnak işaretlerini hemen hemen her yerde değiştirmek için kullanılabilir.

Bir işlevin gövdesi, tek tırnak içine alınması gereken bir dizge olur. Dolar-alıntı, işlev gövdesi içindeki sorunlardan kaçınmak için PostgreSQL'e özgü tek tırnakların yerine geçer. Fonksiyon tanımınızı tek tırnak ile de yazabilirsiniz. Ama o zaman vücuttaki tüm tek alıntılardan kaçmanız gerekir:

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;

Bu o kadar da iyi bir fikir değil. Bunun yerine dolar alıntı kullanın, daha spesifik olarak $$onu benzersiz kılmak için arasına bir simge koyun - işlev gövdesi içinde de $ -quotes kullanmak isteyebilirsiniz. Aslında bunu çok yapıyorum.

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

Detaylar:

İkinci sorunuza gelince:
Örneğinizin son satırını anlamak için en mükemmel kılavuzuCREATE FUNCTION okuyun .


1
İyi bir manuel demeniz gerekiyor , RTEM'de doğru zil sesi yok :)
mu çok kısa

@muistooshort: Benim hatam, temanın bir varyasyonunu denemek uyumu bozmuş gibi görünüyor. RTMEM'i nasıl buldunuz? :)
Erwin Brandstetter

1
Bağırmayı denedim ama aynı değildi. Yine de, nezaketin önemli olduğu bazı durumlar vardır.
mu çok kısa

@ErwinBrandstetter Tamam, ama nedir $body$? Kimden CREATE OR REPLACE FUNCTION update_ts() RETURNS TRIGGER AS $BODY$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $BODY$ LANGUAGE plpgsql- Hiçbir bodyyerde tanımlanmış görmüyorum . Burada neler olduğu hakkında hiçbir fikrim yok
Growler

2
@Growler: Açıkladığım gibi $body$sadece "dolar-alıntı". Daha fazla ayrıntı: stackoverflow.com/a/12320729/939860
Erwin Brandstetter

21

$$, işlev tanımının nerede başladığını ve bittiğini belirtmek için kullandığınız bir sınırlayıcıdır. Aşağıdakileri göz önünde bulundur,

CREATE TABLE <name> <definition goes here> <options go here, eg: WITH OIDS>

Oluşturma işlevi sözdizimi benzerdir, ancak işlevinizde her türlü SQL'i kullanacağınız için (özellikle ifadenin sonu; karakter), sınırlamazsanız ayrıştırıcı hata verir. Öyleyse ifadenizi şu şekilde okumalısınız:

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

Gerçek tanımdan sonraki şeyler, veritabanına işleviniz hakkında daha fazla bilgi verme seçenekleridir, böylece kullanımını optimize edebilir.

Aslında kılavuzda "4.1.2.2. Dolar Fiyatlı Dize Sabitleri" altına bakarsanız, dolar sembolleri arasında karakterleri bile kullanabileceğinizi ve bunların hepsinin bir sınırlayıcı olarak sayılacağını göreceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.