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
请考虑将Erwin回答标记为该问题的答案,他的描述解释了实际上是什么$$,您可以通过阅读它来学习新知识,例如,还有$foo$
csharpfolk

Answers:


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;

这不是一个好主意。使用美元引号代替,更具体地说,还要在它们之间放置一个令牌$$以使其唯一-您可能也想在函数体内使用$引号。实际上,我经常这样做。

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?:)
欧文·布兰德斯特

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。用美元报价的字符串常量”下查看,您会发现甚至可以在美元符号之间使用字符,并且所有字符都将视为一个定界符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.