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

2024-05-03

对于 PL/pgSQL 来说是全新的,双美元符号的含义是什么这个功能 http://postgres.cz/wiki/PL/pgSQL_%28en%29:

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;

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


这些美元符号($$)用于美元报价 https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING,即绝不特定于函数定义。它可用于替换 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, btw.)

这可不是什么好主意。请改用美元引用。更具体地说,还要在其中放入一个(有意义的)令牌$$以避免与函数体中的嵌套引号混淆。其实是一个常见的案例。

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

See:

  • 在 PostgreSQL 中插入带单引号的文本 https://stackoverflow.com/questions/12316953/insert-text-with-single-quotes-in-postgresql/12320729#12320729

对于你的第二个问题:
读最优秀的手动开启CREATE FUNCTION https://www.postgresql.org/docs/current/sql-createfunction.html了解示例的最后一行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PL/pgSQL 中“$$”的用途是什么 的相关文章

  • PostgreSQL regexp_matches 只返回匹配的行?

    这是我第一次使用 regexp matches 我发现使用它只会返回与 SELECT 子句中的所有 regexp matches 匹配的行 例如 SELECT parameters regexp matches parameters a d
  • JSON 值的模式匹配

    运行 Postgres 12 5 的本地 docker 实例 4MBwork mem 我正在实施这个图案 https dba stackexchange com q 108447 3684搜索 json 中的任意字段 目标是搜索并返回 JS
  • Postgres where 子句比较时间戳

    我有一个表 其中列的数据类型timestamp 其中包含一天的多条记录 我想选择与日期对应的所有行 我该怎么做 Assuming you actually mean timestamp because there is no datetim
  • 查找 postgres 提供的列表中不存在的值

    我试图找到一个查询来告诉我数据库中没有的值 例如 select seqID segment from flu where seqID IN 1 2 3 4 5 6 7 8 9 现在 如果我的数据库没有 seqID 3 8 9 我将如何查找
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 对 postgresql 中使用 array_agg 创建的文本聚合进行排序

    我在 postgresql 中有一个表 下表 动物 可以解释我的问题 name tiger cat dog 现在我正在使用以下查询 SELECT array to string array agg name FROM animals 结果是
  • 用数字 1-1000 填充 Postgres 数据库?

    我是 pgAdmin3 的新手 我想用数字 1 1000 填充 pgAdmin3 中的数据库 我该怎么做呢 目前 我创建了一个名为 MyDatabase 的数据库 其中没有任何内容 每行应与其数值相对应 第 1 行应包含 1 第 2 行应包
  • 我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?

    我正在使用 PostgreSQL 全文搜索来进行项目 其中传统停用词 a the if 等 应该被索引和可搜索 这不是默认行为 例如 我可能希望我的用户找到查询 to be or not to be 的结果 The 文档 http www
  • postgresql中数组的区别

    我有两个数组 1 2 3 4 7 6 and 2 3 7 在 PostgreSQL 中可能有共同的元素 我想做的是从第一个数组中排除第二个数组中存在的所有元素 到目前为止我已经取得了以下成果 SELECT array SELECT unne
  • Postgres 中 -Infinity 和 Infinity 的适当值

    在一种情况下 我们必须在 Postgres DB 中存储 无穷大和 无穷大的值 应该考虑什么合适的值 如果没有 请建议最合适的替代方案 你实际上可以使用 infinity and infinity for FLOAT4 and FLOAT8
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • JPA 和 PostqreSQL:长字符串持久化

    谁能告诉我如何使用 JPA 保存长文本 我使用 PostgreSQL 这是我在类中定义很长字符串的方法 Lob private String body 然而 这会产生一个类型的字段字符变化 255 在数据库中 此外 我尝试使用 Column
  • Postgresql 串行错误自动增量

    我在 postgresql 上遇到问题 我认为 postgresql 中有一个错误 我错误地实现了一些东西 有一个表包括colmn1 primary key colmn2 unique colmn3 插入一行后 如果我尝试使用现有的另一次插
  • 如何使用表内的 JSONB 数据类型和 PostgreSQL JDBC 驱动程序将 JSON 对象存储到 PostgreSQL 中

    我想将以下 json 对象保存到 PostgreSQL 数据库表中as jsonb fname john lname doe 我当前使用 PGObject 创建对象并将类型设置为 jsonb 并将值作为 json 字符串传递 寻找更好的 m
  • Django 中从 sqlite 迁移到 postgresql

    我想迁移自sqlite to PostgreSQL db 我安装了 postgresql 并在其 shell 上创建数据库 然后配置我的 django 设置如下 default ENGINE django db backends postg
  • 在 PostgreSql 中计算百分比

    例如我有一个这样的表 string adm A 2 A 1 B 2 A 1 C 1 A 2 通过 SQL 查询 我想要这样的结果 string perc adm A 50 B 100 C 0 我想要每个字符串中数字 2 出现的百分比 我可以
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • 使用 MacPorts 在 Mac OS X 10.5 上安装 PostgreSQL 时出错

    我已经使用 MacPorts 在几台不同的计算机上安装了 PostgreSQL 没有问题 但是当涉及到我自己的笔记本电脑时 我无法构建它 当我执行此命令时 sudo port install postgresql83 我收到此错误 chec
  • 使用 PostGIS 拥有通用 GEOGRAPHY 列

    在 PostgreSQL 9 PostGIS 1 5 中 有没有办法创建 通用 GEOGRAPHY 列 我指的是接受 POINT 以及 POLYGON LINESTRING 等的列 到目前为止 我只在 Internet 上看到过像 GEOG
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面

随机推荐

  • Keycloak 重定向 URI 提供 https://localhost 而不是 http://localhost

    我正在尝试在 Keycloak 上验证 Cordova Android 应用程序 我之前提出过一个关于它的问题 但我在这里将其简化为仅提供要点 因为我在过去 2 3 天中发现了很多东西 Cordova Android 应用程序中的网页不可用
  • 在 JSFiddle 上运行的简单 AngularJS

    如何用以下代码制作 jsfiddle div ul li num li ul div
  • 主表节点缺失

    我已经安装了 Microsoft SQL Server 2012 Express 当我启动 Management Studio 时 我无法查看系统数据库上的任何 表节点 这是一个错误吗 这是一个错误 如以下链接所述 http connect
  • Laravel 4 - 工匠错误 SQLSTATE[42000]

    我正在尝试为我的用户表创建一个新的迁移 我有以下架构 Schema create users function t t gt increments id t gt string username 16 t gt string passwor
  • 非时间戳列上的 Spark 结构化流窗口

    我收到以下形式的数据流 id timestamp val xxx 1 12 15 25 50 1 2 12 15 25 30 1 3 12 15 26 30 2 4 12 15 27 50 2 5 12 15 27 30 3 6 12 15
  • 从字典列表中删除具有重复值的字典

    我有一个字典列表如下 ppm error 5 441115144810845e 07 key Y7 obs ion 1054 5045550349998 ppm error 2 3119997582222951e 07 key Y9 obs
  • C++ 中的显式构造函数调用

    1 以下语句的返回值是多少 obj classX classX 2 关于C 中构造函数的另一个问题 classX 创建一个对象 编译器生成的扩展代码是什么 构造函数不返回值 就像函数返回一样void 对于第二个问题 编译器将调用构造函数 然
  • 如何正确模拟 i18next

    这是我的函数和测试的简化版本 虽然我嘲笑了 useTranslation 我收到以下错误 您正在传递一个未定义的模块 请检查您的对象 传递给 i18next use 7 i18n 8 use Backend gt 9 use initRea
  • 如何通过 Robobrowser 使用代理

    我正在与http robobrowser readthedocs org en latest readme html http robobrowser readthedocs org en latest readme html 一个基于 b
  • `success` 方法已被弃用。使用“then”方法代替

    您好 我是 Vue 世界的新手 这是我收到的警告 成功方法已被弃用 请改用 then 方法 这是代码 apiURL api movies new Vue el app data movies ready function this getM
  • SwiftUI - 方向更改后,NavigationView 标题和后退按钮被夹在状态栏下

    每当我将设备旋转到横向并再次返回时 顶部NavigationView 包括标题和后退按钮 被剪切在状态栏下方 最小可重现示例 struct ContentView View var body some View NavigationView
  • 如何使用 IPython 的事后 %debug 启动 pudb?

    I just 开始了 https documen tician de pudb starting html using breakpoint and pudb 这太棒了 现在我该如何制作 IPython debug神奇的启动pudb 注 p
  • 领域对象返回 nil (Swift)

    我有一个自定义多边形对象 因此我可以将地图叠加保存到领域 我能够成功创建这个对象 但是当我想检索 var 多边形对象时 它返回 nil 当我打印多边形对象时 它可以很好地打印出所有数据 这是打印内容的示例 CustomPolygon nam
  • 通过 MailChimp 发送电子邮件

    我认为问题出在附近 api gt listSubscribers include libs mailchimp MCAPI class php options array list id gt list id subject gt Prov
  • 如何等待在react.js中渲染视图直到$.get()完成?

    您好 我正在用 Reactjs 编写一个聊天客户端 并希望使用从 REST 调用检索到的数据来渲染我的组件 但是 我的组件是在 REST 请求返回数据之前渲染的 当我在我的子组件中调用 this props 时 这会导致错误 var Mai
  • 内部没有图像的链接的 jQuery 选择器

    我绑定一个click链接功能 body on click a function do something 现在我正在寻找一个仅在链接不包含图像标签时才匹配的选择器 有点类似于a not img but img是子元素 我怎样才能做到这一点
  • 修复 Vanilla JS Accordion 以一次展开一个选项卡

    我有这个手风琴工作 但是 我试图弄清楚如何一次仅展开一个 单击另一个选项卡 另一个选项卡关闭 我尝试了不同的方法来删除该类 但没有得到预期的结果 我也一直在尝试重构for循环到 ES6 标准 但这不是一个问题 样式是 Sass 因此在 JS
  • 从文本文件加载数据然后将其存储到数据库的最快方法

    我有问题 我正在开发一个项目 但我陷入了这一部分 我想从文本文件加载数据并将其存储到数据库访问中 things 是每个文本文件内的数据 大约 12 000 行数据 每个文本文件大约需要 10 分钟来处理 注意 在存储数据之前 我将文本文件中
  • WSo2 EMM - 应用程序管理数据库错误

    运行 WSo2 EMM 1 1 0 除了一个大问题外 一切都工作正常 从我第一次单击 应用程序管理 选项卡中的应用程序那一刻起 只要服务器正在运行 WSO2EMM DB h2 db 文件就会开始稳定增长 即使完全没有任何更改 最终 它变得如
  • PL/pgSQL 中“$$”的用途是什么

    对于 PL pgSQL 来说是全新的 双美元符号的含义是什么这个功能 http postgres cz wiki PL pgSQL 28en 29 CREATE OR REPLACE FUNCTION check phone number