当前位置: 首页 > 知识库问答 >
问题:

在PL/pgSQL中' $$ '有什么用途

黄沈浪
2023-03-14

对于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布尔值AS$$中,$$是占位符。

最后一行有点玄机:< code > $ $ LANGUAGE plpgsql STRICT IMMUTABLE;

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

共有2个答案

缑高朗
2023-03-14

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

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.美元报价字符串常量“在手册中,您将看到您甚至可以在美元符号之间使用字符,并且它们都将计为一个分隔符。

东方夕
2023-03-14

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

这不是一个好主意。请改用美元报价。更具体地说,还要在 $$ 之间放置一个令牌以使每个货币对唯一 - 您可能希望在函数体中使用嵌套的美元报价。实际上,我经常这样做。

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

看:

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

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

 类似资料:
  • 问题内容: 对来说是全新的,此函数中双美元符号的含义是什么: 我猜想在中是一个占位符。 最后一行有点神秘: ; 顺便说一句,最后一行是什么意思? 问题答案: 美元符号用于美元报价,并且绝不特定于功能定义。它几乎可以在SQL脚本中的任何地方用于替换单引号。 函数的主体恰好是字符串文字,必须用单引号将其引起来。美元报价是PostgreSQL特定于单引号的替代,以避免在函数体内引用问题。您也可以用单引号

  • 问题内容: PostgreSQL文件说: SQL函数的整个主体在执行任何函数之前都会被解析。 虽然SQL函数可以包含 更改系统目录的命令 (例如),但是在对函数中的后续命令进行语法分析时,这些命令的效果将不可见。因此,例如, 如果打包到单个SQL函数中将无法按预期工作 ,因为解析命令时foo尚不存在。 在这种情况下,建议使用PL / pgSQL代替SQL函数。 为什么“在这种情况下,建议使用PL

  • 我已经找到了解决方案(我认为),我将要求在甲骨文和SQL服务器上的问题,但似乎无法将其转化为Postgres解决方案。我正在使用Postgres 9.3.6。 这个想法是能够生成有关表内容的“元数据”以用于分析目的。这只能通过为每列运行查询来完成 (AFAIK),以便找出,比如说......最小值/最大值/计数值等。为了自动执行该过程,最好先由数据库生成查询,然后执行。 使用示例表,我能够使用以下

  • PostgreSQL PL/pgSQL 调试器能指导你一步一步调试 PL/pgSQL 过程或函数。若要启动调试器,请点击函数设计器内的 “调试”按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 运行 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 逐过程 恢复运行。当前的行将被运行。如果该行是一个过程或函数调用,它会

  • PostgreSQL PL/pgSQL 调试器能指导你一步一步调试 PL/pgSQL 过程或函数。若要启动调试器,请点击函数设计器内的 按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 停止逐步运行代码。运行将停止,并且无法恢复。 恢复运行。当前的行将被运行。如果该行是

  • PostgreSQL PL/pgSQL 调试器能指导你一步一步调试 PL/pgSQL 过程或函数。若要启动调试器,请点击函数设计器内的 “调试” 按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 运行 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 逐过程 恢复运行。当前的行将被运行。如果该行是一个过程或函数调用,它