PL / pgSQL में '$$' का क्या उपयोग किया जाता है


93

PL / pgSQL के लिए पूरी तरह से नया होने के नाते, इस फ़ंक्शन में डबल डॉलर संकेतों का क्या अर्थ है :

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;

मुझे लगता है कि अनुमान लगा रहा हूँ, में RETURNS boolean AS $$, $$एक प्लेसहोल्डर है।

अंतिम पंक्ति एक रहस्य है: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

वैसे, अंतिम पंक्ति का क्या अर्थ है?


4
कृपया इरविन की प्रतिक्रिया को इस प्रश्न के उत्तर के रूप में चिह्नित करने पर विचार करें, उनका विवरण बताता है कि वास्तव में क्या हैं $$और आप इसे पढ़कर कुछ नया सीख सकते हैं जैसे कि यह भी है$foo$
csharpfolk

जवाबों:


135

डॉलर के संकेतों का उपयोग डॉलर के उद्धरण के लिए किया जाता है और यह किसी भी तरह से कार्य परिभाषाओं के लिए विशिष्ट नहीं है । इसका उपयोग SQL स्क्रिप्ट में कहीं भी एकल उद्धरणों को बदलने के लिए किया जा सकता है।

एक फ़ंक्शन का शरीर एक स्ट्रिंग शाब्दिक होता है जिसे एकल उद्धरणों में संलग्न करना होता है। डॉलर-उद्धरण एकल बॉडी के लिए एक PostgreSQL-विशिष्ट विकल्प है जो फ़ंक्शन बॉडी के अंदर समस्याओं को उद्धृत करने से बचने के लिए है। आप अपनी फ़ंक्शन परिभाषा को एकल-उद्धरण के साथ ही लिख सकते हैं। लेकिन तब आपको शरीर के सभी सिंगल-कोट्स से बचना होगा:

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;

यह इतना अच्छा विचार नहीं है। इसके बजाय डॉलर- $$कोटिंग का उपयोग करें , अधिक विशेष रूप से इसे अद्वितीय बनाने के बीच एक टोकन भी डालते हैं - आप फ़ंक्शन बॉडी के अंदर $ -quotes का भी उपयोग करना चाह सकते हैं। मैं वास्तव में बहुत कुछ करता हूं।

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

विवरण:

अपने दूसरे प्रश्न के रूप में: अपने उदाहरण की अंतिम पंक्ति को समझने के लिए
सबसे उत्कृष्ट मैनुअलCREATE FUNCTION पढ़ें ।


1
आप ठीक मैनुअल कहने वाले हैं , RTEM के पास सही रिंग नहीं है :)
mu बहुत छोटा है

@ म्युइस्टोशॉर्ट: मेरा बुरा, विषय पर एक बदलाव की कोशिश करने से सद्भाव टूट गया है। आपको RTMEM कैसे पसंद है? :)
एरविन ब्रान्डसेट्टर

1
मैंने इसे चिल्लाने की कोशिश की और यह सिर्फ वही नहीं था। हालाँकि, कुछ परिस्थितियाँ ऐसी हैं जहाँ राजनीति की गिनती होती है।
म्यू बहुत कम

@ErwinBrandstetter ठीक है, लेकिन क्या है $body$? से CREATE OR REPLACE FUNCTION update_ts() RETURNS TRIGGER AS $BODY$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $BODY$ LANGUAGE plpgsql- मुझे bodyकहीं भी परिभाषित नहीं दिखता । मुझे वास्तव में पता नहीं है कि यहाँ क्या हो रहा है
ग्रोल्डर

2
@Growler: $body$बस "डॉलर-उद्धृत" है, जैसे मैंने समझाया। अधिक जानकारी: stackoverflow.com/a/12320729/939860
इरविन ब्रान्डस्टेट्टर

21

$ $ एक सीमांकक है जिसका उपयोग आप इंगित करने के लिए करते हैं कि फ़ंक्शन की परिभाषा कहाँ शुरू होती है और समाप्त होती है। निम्नलिखित को धयान मे रखते हुए,

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

फ़ंक्शन फ़ंक्शन सिंटैक्स समान है, लेकिन क्योंकि आप अपने फ़ंक्शन में SQL के सभी प्रकार का उपयोग करने जा रहे हैं (विशेष रूप से कथन, वर्ण का अंत), तो पार्सर यात्रा करेगा यदि आपने इसे सीमांकित नहीं किया है। तो आपको अपना वक्तव्य इस प्रकार पढ़ना चाहिए:

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

वास्तविक परिभाषा के बाद सामान आपके फ़ंक्शन के बारे में डेटाबेस को अधिक जानकारी देने के लिए विकल्प हैं, इसलिए यह इसके उपयोग को अनुकूलित कर सकता है।

वास्तव में यदि आप मैनुअल में "4.1.2.2। डॉलर-कोटेड स्ट्रिंग कॉन्स्टेंट्स" के तहत देखते हैं, तो आप देखेंगे कि आप डॉलर के प्रतीकों के बीच के अक्षरों का भी उपयोग कर सकते हैं और यह सभी एक सीमांकक के रूप में गिना जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.