↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

37.2. PL/pgSQL 开发技巧 #

开发 PL/pgSQL 的一个好方法是,用你选定的文本 编辑器创建函数,同时在另一个窗口用 psql 装载 并测试这些函数。如果你这样做,最好用 CREATE OR REPLACE FUNCTION 编写函数。这样只需重新装载文件即可更新函数定义。 例如:

CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS '
          ....
end;
' LANGUAGE plpgsql;

在运行 psql 期间,可以用

\i filename.sql

装载或重新装载这样的函数定义文件,然后立即发出 SQL 命令来测试该函数。

开发 PL/pgSQL 的另一个好方法是使用便于过程 语言开发的 GUI 数据库访问工具。PgAccess 就是这样一个 工具的例子,尽管还有其他工具。这类工具通常提供便捷特性,例如转义单引号、 让重新创建和调试函数变得更容易。

37.2.1. 引号的处理 #

由于 PL/pgSQL 函数的代码在 CREATE FUNCTION 中是作为字符串字面量指定的,函数体 内部的单引号必须通过加倍来转义。这有时会导致相当复杂的代码,尤其是当 你在编写一个生成其他函数的函数时,例如 第 37.6.4 节 中的例子。下表可作为各种 情况下所需引号数目的一个概要,或许有用。

1 个引号

用于开始和结束函数体,例如:

CREATE FUNCTION foo() RETURNS integer AS '...'
    LANGUAGE plpgsql;

在函数体内的任何位置,引号都必须成对出现。

2 个引号

用于函数体内部的字符串字面量,例如:

a_output := ''Blah'';
SELECT * FROM users WHERE f_name=''foobar'';

PL/pgSQL 会把第二行看作

SELECT * FROM users WHERE f_name='foobar';
4 个引号

当你在函数体内部的字符串常量中需要一个单引号时,例如:

a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''

实际追加到 a_output 的值将是: AND name LIKE 'foobar' AND xyz。

6 个引号

当函数体内部字符串中的一个单引号与该字符串常量的末尾相邻时,例如:

a_output := a_output || '' AND name LIKE ''''foobar''''''

此时追加到 a_output 的值将是: AND name LIKE 'foobar'。

10 个引号

当你想在字符串常量中得到两个单引号(这需要 8 个引号),并且它们与该 字符串常量的末尾相邻(再加 2 个)时。只有当你在编写生成其他函数的 函数时才可能需要这样做。例如:

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;

另一种方法是用反斜杠而不是加倍来转义函数体中的引号。用这种方法,你会 发现自己在写 \'\' 而不是 '''' 这样的东西。有些 人觉得这样更容易跟踪,有些人则不这么认为。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。