'$$' ใช้สำหรับอะไรใน PL / pgSQL


98

เป็นใหม่สำหรับ 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

คำตอบ:


143

สัญญาณดอลล่าจะใช้สำหรับเงินดอลลาร์ quotingและในทางที่ไม่เฉพาะเจาะจงกับคำจำกัดความของฟังก์ชั่น สามารถใช้แทนเครื่องหมายคำพูดเดี่ยวได้ทุกที่ในสคริปต์ 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 ไม่มีวงแหวนที่เหมาะสม :)
มูสั้นเกินไป

@muistooshort: ฉันไม่ดีการลองใช้รูปแบบในธีมดูเหมือนจะทำลายความสามัคคี คุณชอบ RTMEM อย่างไร? :)
Erwin Brandstetter

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กำหนดไว้ที่ใดเลย ฉันไม่รู้จริงๆว่าเกิดอะไรขึ้นที่นี่
Growler

2
@Growler: $body$เป็นเพียง "การอ้างเงินดอลลาร์" เหมือนที่ฉันอธิบาย รายละเอียดเพิ่มเติม: stackoverflow.com/a/12320729/939860
Erwin Brandstetter

21

$$ คือตัวคั่นที่คุณใช้เพื่อระบุว่านิยามฟังก์ชันเริ่มต้นและสิ้นสุดที่ใด พิจารณาสิ่งต่อไปนี้

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

ไวยากรณ์ของฟังก์ชัน create จะคล้ายกัน แต่เนื่องจากคุณจะใช้ SQL ทุกประเภทในฟังก์ชันของคุณ (โดยเฉพาะท้ายคำสั่งอักขระ) ตัวแยกวิเคราะห์จะเดินทางหากคุณไม่ได้คั่น ดังนั้นคุณควรอ่านคำสั่งของคุณว่า:

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

สิ่งที่อยู่หลังคำจำกัดความจริงคือตัวเลือกในการให้ข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันของคุณแก่ฐานข้อมูลเพื่อให้สามารถเพิ่มประสิทธิภาพการใช้งาน

ในความเป็นจริงถ้าคุณดูภายใต้ "4.1.2.2. Dollar-Quoted String Constants" ในคู่มือคุณจะเห็นว่าคุณสามารถใช้อักขระที่อยู่ระหว่างสัญลักษณ์ดอลลาร์และทั้งหมดจะนับเป็นตัวคั่นหนึ่งตัว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.