“$$”在PL / pgSQL中的用途是什么

What are '$$' used for in PL/pgSQL

提问人:vector 提问时间:8/27/2012 最后编辑:mu is too shortvector 更新时间:7/31/2023 访问量:75427

问:

作为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;

我猜,in ,是一个占位符。RETURNS boolean AS $$$$

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

顺便问一下,最后一行是什么意思?

PostgreSQL PLPGSQL 符号 美元 报价

评论

4赞 csharpfolk 8/6/2016
请考虑将 Erwin 的回答标记为这个问题的答案,他的描述解释了实际是什么,您可以通过阅读它来学习新的东西,例如还有$$$foo$

答:

26赞 Captain Coder 8/27/2012 #1

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

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.Dollar-Quoted String Constants“,您会看到您甚至可以在美元符号之间使用字符,并且它们都将计为一个分隔符。

评论

0赞 Guido Tarsia 4/27/2023
如正确答案所述,这是不准确的,双美元符号分隔常量字符串,并且不特定于函数。
218赞 Erwin Brandstetter 8/29/2012 #2

这些美元符号 () 用于美元报价,这绝不是特定于函数定义的。它可用于替换 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$;

看:

对于您的第二个问题:
阅读有关 CREATE FUNCTION 的最优秀的手册,以了解示例的最后一行。

评论

2赞 mu is too short 8/29/2012
你应该说是很好的手册,RTEM 只是没有合适的戒指:)
0赞 Erwin Brandstetter 8/29/2012
@muistooshort:我不好,尝试主题的变奏似乎打破了和谐。你觉得RTMEM怎么样?:)
1赞 mu is too short 8/29/2012
我试着大喊大叫,但就是不一样。虽然,在某些情况下,礼貌很重要。
0赞 user3871 2/2/2017
@ErwinBrandstetter 好吧,但是什么?从 - 我在任何地方都看不到定义。我真的不知道这是怎么回事$body$CREATE OR REPLACE FUNCTION update_ts() RETURNS TRIGGER AS $BODY$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $BODY$ LANGUAGE plpgsqlbody
2赞 Erwin Brandstetter 2/2/2017
@Growler:就像我解释的那样,只是“美元报价”。更多详情:stackoverflow.com/a/12320729/939860$body$