【问题标题】:What are '$$' used for in PL/pgSQL'$$' 在 PL/pgSQL 中用于什么
【发布时间】:2012-08-22 01:50:56
【问题描述】:

对 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;

对了,最后一行是什么意思?

【问题讨论】:

  • 请考虑将 Erwin 的回复标记为对这个问题的回答,他的描述解释了 $$ 的实际含义,您可以通过阅读它来学习新的东西,例如还有$foo$

标签: postgresql plpgsql quotes dollar-sign dollar-quoting


【解决方案1】:

这些美元符号 ($$) 用于dollar quoting,它并非特定于函数定义。它可用于替换 SQL 脚本中任意位置包含字符串文字(常量)的单引号。

函数的主体恰好是这样的字符串文字。 Dollar-quoting 是 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'';
  END IF;
  RETURN true; 
END
';

这不是一个好主意。改为使用美元报价。更具体地说,还要在 $$ 之间放置一个标记,以使每一对都独一无二 - 您可能希望在函数体内使用嵌套的美元引号。实际上,我经常这样做。

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

见:

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

【讨论】:

  • 你应该说很好的手册,RTEM 只是没有合适的戒指:)
  • @muistooshort:我的错,尝试改变主题似乎破坏了和谐。你觉得 RTMEM 怎么样? :)
  • 我试着大喊大叫,结果不一样了。不过,在某些情况下,礼貌很重要。
  • @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: $body$ 只是“美元报价”,就像我解释的那样。更多详情:stackoverflow.com/a/12320729/939860
【解决方案2】:

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

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

创建函数的语法类似,但是因为您将在函数中使用各种 SQL(尤其是语句的结尾;字符),如果您不对其进行定界,解析器就会出错。所以你应该把你的陈述读成:

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

实际定义之后的东西是选项,可以为数据库提供有关您的功能的更多信息,以便优化其使用。

事实上,如果您查看手册中的“4.1.2.2. Dollar-Quoted String Constants”,您会发现您甚至可以在美元符号之间使用字符,它们都将被视为一个分隔符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多