[postgresql] PL / pgSQL에서 사용되는 ‘$$’는 무엇입니까?
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;
그건 그렇고, 마지막 줄은 무엇을 의미합니까?
답변
달러 표지판에 사용되는 달러 인용 부호 와있는 함수 정의 할 수있는 방법을 구체적으로 . 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
읽고 예제의 마지막 줄을 이해하십시오.
답변
$$는 함수 정의가 시작되고 끝나는 위치를 나타내는 데 사용하는 구분 기호입니다. 다음을 고려하세요,
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. 달러 인용 문자열 상수”를 보면 달러 기호 사이에 문자를 사용할 수도 있으며 모두 하나의 구분 기호로 계산된다는 것을 알 수 있습니다.