对于 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(使用前将#替换为@)