pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
在 PL/pgSQL 中进行开发的一种好方法, 是用你喜欢的文本编辑器编写函数,并在另一个窗口里使用 psql 载入和测试这些函数。如果你采用 这种方式,最好使用 CREATE OR REPLACE FUNCTION 来编写函数。这样只需重新载入该文件, 就可以更新函数定义。例如:
CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $$
....
$$ LANGUAGE plpgsql;
在运行 psql 期间,你可以用下面的命令 载入或者重载这样一个函数定义文件:
\i filename.sql
并且接着立即发出 SQL 命令来测试该函数。
在 PL/pgSQL 中进行开发的另一种好方法 是使用便于过程语言开发的 GUI 数据库访问工具。这类工具的一个 例子是 pgAdmin,当然还有其他工具。这些工具 通常提供诸如转义单引号、更便于重新创建和调试函数之类的便捷 特性。
一个 PL/pgSQL 函数的代码在一个 CREATE FUNCTION 中被指定为一个字符串字面量。 如果你用通常的方式把该字符串写在单引号中间,那么该函数体中的 任何单引号都必须被双写;同样任何反斜线也必须被双写(假定使用了 转义字符串语法)。双写引号本身就很繁琐,并且在更复杂的情况中 代码会变得完全无法理解,因为你很容易发现你需要半打或者更多 相邻的引号。我们推荐你转而把函数体写成一个 “美元引用”的字符串字面量(见 第 4.1.2.4 节)。在美元引用方法中, 你从不需要双写任何引号。但是要注意为你需要的每一层嵌套选择 一个不同的美元引用定界符。例如,你可能把 CREATE FUNCTION 命令写成:
CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $PROC$
....
$PROC$ LANGUAGE plpgsql;
在这里面,你可以在 SQL 命令中为简单字符串使用引号并且用 $$ 来界定被你组装成字符串的 SQL 命令片段。 如果你需要引用包括 $$ 的文本,你可以使用 $Q$ 等等。
下表展示了在不使用美元引用时,编写引号必须采取的做法。在把 旧式的非美元引用代码改写成更易理解的形式时,它可能会有所帮助。
用来开始和结束函数体,例如:
CREATE FUNCTION foo() RETURNS integer AS '
....
' LANGUAGE plpgsql;
在一个单引号引用的函数体中的任何位置,引号必须成对出现。
用于函数体内的字符串字面量,例如:
a_output := ''Blah''; SELECT * FROM users WHERE f_name=''foobar'';
在美元引用方法中,你只需要写:
a_output := 'Blah'; SELECT * FROM users WHERE f_name='foobar';
这恰好就是 PL/pgSQL 解析器在两种 情况中会看到的。
当你在函数内的一个字符串常量中需要一个单引号时,例如:
a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''
实际会被追加到 a_output 的值将是: AND name LIKE 'foobar' AND xyz。
在美元引用方法中,你可以写:
a_output := a_output || $$ AND name LIKE 'foobar' AND xyz$$
要小心在这周围的任何美元引用定界符都不能只是 $$。
当在函数体内的一个字符串中的一个单引号与该字符串常量末尾 相邻,例如:
a_output := a_output || '' AND name LIKE ''''foobar''''''
被追加到 a_output 的值则将是: AND name LIKE 'foobar'.
在美元引用方法中,这会变成:
a_output := a_output || $$ AND name LIKE 'foobar'$$
当你想要在一个字符串常量中使用两个单引号(这需要 8 个引号), 并且它们与该字符串常量的末尾相邻(还需 2 个)时。你可能只 在编写生成其他函数的函数时才需要这样做,例如 例 39.7. 例如:
a_output := a_output || '' if v_'' ||
referrer_keys.kind || '' like ''''''''''
|| referrer_keys.key_string || ''''''''''
then return '''''' || referrer_keys.referrer_type
|| ''''''; end if;'';
a_output 的值则将是:
if v_... like ''...'' then return ''...''; end if;
在美元引用方法中,这会变成:
a_output := a_output || $$ if v_$$ || referrer_keys.kind || $$ like '$$
|| referrer_keys.key_string || $$'
then return '$$ || referrer_keys.referrer_type
|| $$'; end if;$$;
这里我们假定只需要把单引号放进 a_output,因为它在使用前会被重新加引号。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。