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

달러 표지판에 사용되는 달러 인용 부호 와있는 함수 정의 할 수있는 방법을 구체적으로 . 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;

이것은 좋은 생각이 아닙니다. 대신 달러 인용을 사용하십시오.보다 구체적으로 토큰을 사이에 넣어 $$고유하게 만드십시오. 함수 본문 내에 $ 인용 부호를 사용할 수도 있습니다. 실제로 많이합니다.

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

세부:

두 번째 질문에 관해서 :
가장 우수한 매뉴얼을CREATE FUNCTION 읽고 예제의 마지막 줄을 이해하십시오.


1
당신은 훌륭한 매뉴얼 을 말해야 합니다 . RTEM은 올바른 링을 가지고 있지 않습니다. :)
mu는 너무 짧습니다.

@muistooshort : 내 안타깝게도 테마에 대한 변형을 시도하는 것이 조화를 깨뜨린 것 같습니다. RTMEM은 어떻습니까? :)
어윈 Brandstetter

1
소리를 지르려고했지만 같지 않았습니다. 그러나 예의가 중요한 상황이 있습니다.
mu가 너무 짧습니다.

@ErwinBrandstetter 좋아요,하지만 무엇 $body$입니까? From- 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 2017

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. 달러 인용 문자열 상수"를 보면 달러 기호 사이에 문자를 사용할 수도 있으며 모두 하나의 구분 기호로 계산된다는 것을 알 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.