美元引用的字符串常量

简介:在本教程中,您将学习如何 $$ 在用户定义的函数和存储过程中使用美元引用的字符串常量 ( )。

介绍美元引用的字符串常量语法

在 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
$$

概括

  • 使用带引号的美元字符串常量来避免转义单引号或反斜杠。
  • 始终在用户定义的函数和存储过程中使用带引号的字符串常量,以使代码更具可读性。