美元引用的字符串常量
简介:在本教程中,您将学习如何 $$ 在用户定义的函数和存储过程中使用美元引用的字符串常量 ( )。
介绍美元引用的字符串常量语法
在 PostgreSQL 中,您对字符串常量使用单引号,如下所示:
select 'String constant';
当字符串常量包含单引号 ( ') 时,您需要通过将单引号加倍来对其进行转义。例如:
select 'I''m also a string constant';
如果您使用旧版本的 PostgreSQL,您可以在字符串常量前面加上 E 声明后缀转义字符串语法并使用反斜杠 \ 来转义单引号,如下所示:
select E'I\'m also a string constant';
如果字符串常量包含反斜杠,则需要使用另一个反斜杠对其进行转义。
当字符串常量包含许多单引号和反斜杠时,就会出现问题。将每个单引号和反斜杠加倍会使字符串常量更难以阅读和维护。
PostgreSQL 8.0 版引入了美元引用功能,使字符串常量更具可读性。
下面显示了用美元引用的字符串常量的语法:
$tag$<string_constant>$tag$
在此语法中, tag 是可选的。它可能包含零个或多个字符。
在 之间 $tag$ ,您可以放置任何带有单引号 ( ' ) 和反斜杠 ( \) 的字符串。例如:
select $$I'm a string constant that contains a backslash \$$;
在这个例子中,我们没有指定 tag 两个美元符号 ( $)之间的。
以下示例使用带标记的美元引号字符串常量语法:
SELECT $message$I'm a string constant that contains a backslash \$message$;
在本例中,我们使用字符串 message 作为两个美元符号 ( $)之间的标记
在匿名块中使用美元引用的字符串常量
下面显示了 PL/pgSQL 中的匿名块:
do
'declare
film_count integer;
begin
select count(*) into film_count
from film;
raise notice ''The number of films: %'', film_count;
end;';
请注意,您将在PL/pgSQL 块结构教程中了解匿名块。在本教程中,您可以将代码复制并粘贴到任何 PostgreSQL 客户端工具(如 pgAdmin 或 psql)中以执行它。
块中的代码必须用单引号括起来。如果它有任何单引号,则需要通过将其加倍来转义它,如下所示:
raise notice ''The number of films: %'', film_count;
为避免转义每个单引号和反斜杠,您可以使用美元引用的字符串,如下所示:
do
$$
declare
film_count integer;
begin
select count(*) into film_count
from film;
raise notice 'The number of films: %', film_count;
end;
$$
在此示例中,您不需要对单引号和反斜杠进行转义。
在函数中使用美元引用的字符串常量
下面显示了 CREATE FUNCTION 允许您创建用户定义函数的语句的语法:
create function function_name(param_list)
returns datatype
language lang_name
as
'function_body'
请注意,您将 CREATE FUNCTION 在创建函数教程中了解有关语句语法的更多信息。
在此语法中, function_body 是字符串常量。例如,以下函数通过 id 查找电影:
create function find_film_by_id(
id int
) returns film
language sql
as
'select * from film
where film_id = id';
如您所见, find_film_by_id() 函数体被单引号包围。
如果函数有很多语句,它会变得更难阅读。在这种情况下,您可以使用美元引用的字符串常量语法:
create function find_film_by_id(
id int
) returns film
language sql
as
$$ select * from film
where film_id = id;
$$;
现在,您可以在 $$ 和之间放置任何代码,而 $$ 无需使用单引号或反斜杠来转义单引号和反斜杠。
在存储过程中使用美元引用的字符串常量
同样,您可以在存储过程中使用美元引用的字符串常量语法,如下所示:
create procedure proc_name(param_list)
language lang_name
as $$ -- stored procedure body
$$
概括
- 使用带引号的美元字符串常量来避免转义单引号或反斜杠。
- 始终在用户定义的函数和存储过程中使用带引号的字符串常量,以使代码更具可读性。