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 $$值为RETURNS boolean AS $$$$是一个占位符。

最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

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

美元符号用于美元报价 ,而不是特定于函数定义 。 它可以用来在SQL脚本的任何地方replace单引号。

函数体正好是一个string,必须用单引号括起来。 美元引用是一个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; 

细节:

  • 在PostgreSQL中用单引号插入文本

至于你的第二个问题:
阅读CREATE FUNCTION上最优秀的手册来理解你的例子的最后一行。

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

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

创build函数的语法是相似的,但是因为你要在你的函数中使用各种SQL(尤其是语句的结尾),所以如果你没有对它进行分隔的话,parsing器就会绊倒。 所以你应该读你的声明:

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

实际定义之后的东西是给数据库更多关于你的函数的信息的选项,所以它可以优化它的使用。

事实上,如果您在手册中查看“4.1.2.2。美元引用的string常量”,您将会看到,甚至可以使用美元符号之间的字符,并将它们作为一个分隔符。