postgresql PL/pgSQL中的“$$”是什么

pokxtpni  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(558)

作为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;
顺便问一下,最后一行是什么意思?

mklgxw1f

mklgxw1f1#

这些美元符号($$)用于美元引号,这决不是特定于函数定义的。它可用于替换SQL脚本中任何位置的用单引号括住的字符串文字(常量)。
函数体恰好是这样的字符串文字。美元引号是PostgreSQL特定的单引号替代,以避免嵌套单引号的转义(递归)。您也可以用单引号将函数体括起来。但是,您必须对所有嵌套的单引号进行转义:

CREATE OR REPLACE FUNCTION check_phone_number(text)
  RETURNS boolean
  LANGUAGE plpgsql STRICT IMMUTABLE AS
'
BEGIN
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
    RAISE EXCEPTION ''Malformed string: "%". Expected format is +999 999'', $1;
  END IF;
  RETURN true; 
END
';

字符串
(添加了RAISE的缺失参数,顺便说一句。)
这可不是个好主意请改用美元报价。更具体地说,还要在$$中放置一个(有意义的)标记,以避免与函数体中的嵌套引号混淆。实际上是个普通的案子。

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


请参阅:

  • 在PostgreSQL中插入带单引号的文本

第二个问题:
阅读最优秀的manual on CREATE FUNCTION以理解示例的最后一行。“

qco9c6ql

qco9c6ql2#

$$是一个定界符,用于指示函数定义的开始和结束位置。考虑以下情况,

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.4.在手册中,你会看到你甚至可以在美元符号之间使用字符,它们都将被视为一个分隔符。

相关问题