什么是'$$'用于PL / pgSQL

时间:2012-08-27 14:46:54

标签: postgresql plpgsql quotes dollar-sign

对PL / pgSQL完全陌生,this function中双美元符号的含义是什么:

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;

顺便说一句,最后一行是什么意思?

2 个答案:

答案 0 :(得分:105)

美元符号用于dollar 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;

详细说明:

关于你的第二个问题:
阅读最优秀的manual on CREATE FUNCTION以了解您示例的最后一行。

答案 1 :(得分:19)

$$是一个分隔符,用于指示函数定义的开始和结束位置。请考虑以下内容,

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

create function语法类似,但是因为你要在你的函数中使用各种SQL(特别是语句的结尾;字符),如果你没有分隔它,解析器会跳闸。所以你应该把你的陈述读作:

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

实际定义之后的内容是为数据库提供有关函数的更多信息的选项,因此可以优化其用法。

事实上,如果你看一下手册中的“4.1.2.2。美元引用字符串常量”,你会发现你甚至可以在美元符号之间使用字符,它们都算作一个分隔符。