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

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 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE FUNCTION

CREATE FUNCTION — 定义一个新函数

大纲

CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
    RETURNS rettype
  { LANGUAGE langname
    | IMMUTABLE | STABLE | VOLATILE
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...
    [ WITH ( attribute [, ...] ) ]

描述

CREATE FUNCTION定义一个新函数。 CREATE OR REPLACE FUNCTION将创建一个新函数,或者替换现有定义。

如果包含模式名,则函数将在指定的模式中创建。否则将在当前模式中创建。新函数的名称不能与同一模式中具有相同参数类型的任何现有函数匹配。然而,不同参数类型的函数可以共享一个名称(这称为重载)。

要更新现有函数的定义,可以使用CREATE OR REPLACE FUNCTION。但不能用这种方式更改函数的名称或者参数类型(如果尝试这样做,实际上就会创建一个新的不同函数)。此外,CREATE OR REPLACE FUNCTION也不允许更改现有函数的返回类型。要做到这一点,必须删除该函数并重新创建。

如果删除函数后再重新创建,新函数就不再是旧函数的同一实体;你将破坏引用旧函数的现有规则、视图、触发器等。使用CREATE OR REPLACE FUNCTION可以在不破坏引用该函数的对象的情况下更改函数定义。

创建该函数的用户将成为该函数的拥有者。

参数

name

要创建的函数的名称。

argtype

函数参数的数据类型(可以有模式限定),如果有的话。参数类型可以是基本类型、复合类型或域,也可以复制一个现有列的类型。

引用一个列的类型时写作 tablename.columnname%TYPE; 有时使用这种写法可以帮助让函数独立于表定义的变化。

取决于实现语言,也可能允许指定cstring之类的“伪类型”。 伪类型表示实际参数类型要么没有完整指定,要么在普通 SQL 数据类型的范围之外。

rettype

返回数据类型(可以有模式限定)。返回类型可以是基本类型、复合类型或域,也可以指定为复制一个现有列的类型。关于如何引用现有列的类型,见上面argtype的描述。

取决于实现语言,也可能允许指定cstring之类的“伪类型”。 SETOF 修饰符表示该函数将返回一组结果项,而不是单个项。

langname

函数实现所用的语言名称。可以是SQL、C、 internal,或者一种用户定义的过程语言的名称。 (另见createlang。)为了向后兼容,该名称可以用单引号包围。

IMMUTABLE
STABLE
VOLATILE

这些属性告知系统,出于运行时优化的目的,用单次求值替换对函数的多次求值是否安全。 最多只能指定其中之一。如果没有出现这些选项, 默认假定是VOLATILE。

IMMUTABLE表示该函数在给定相同参数值时总是返回相同结果;也就是说,它不做数据库查找,也不使用不直接出现在其参数列表中的信息。如果给出了这个选项,任何用全常量参数对该函数的调用都可以立即替换为函数值。

STABLE表示在一次表扫描中,该函数对相同参数值会一致地返回相同结果,但其结果可能跨 SQL 语句变化。对于结果依赖数据库查找、参数变量(例如当前时区)等的函数,这是合适的选择。还要注意,current_timestamp函数族属于稳定(stable),因为它们的值在一个事务内不会改变。

VOLATILE表示即使在一次表扫描中函数值也可能改变,因此无法做任何优化。相对较少的数据库函数在这个意义上是易变(volatile)的; 一些例子是random()、currval()、 timeofday()。注意,任何有副作用的函数都必须归类为 volatile,即使其结果相当可预测,以防止调用被优化掉;一个例子是 setval()。

CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
STRICT

CALLED ON NULL INPUT(默认值)表示当某些参数为空时,函数仍会被正常调用。此时如有必要,由函数作者负责检查空值并做出适当响应。

RETURNS NULL ON NULL INPUT或 STRICT表示只要任一参数为空,函数就总是返回空。如果指定了这个选项,当存在空参数时函数不会被执行;而是自动假定结果为空。

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER

SECURITY INVOKER表示函数将以调用它的用户的权限执行。 这是默认值。SECURITY DEFINER 指定函数将以创建它的用户的权限执行。

关键字EXTERNAL是为了 SQL 一致性而存在的,但它是可选的,因为与 SQL 中不同,这个特性并不只适用于外部函数。

definition

定义函数的字符串;其含义取决于语言。它可以是内部函数名、对象文件的路径、SQL 命令,或者过程语言中的文本。

obj_file, link_symbol

当 C 语言源代码中的函数名与 SQL 函数名不同时,动态载入的 C 语言函数使用这种形式的AS子句。字符串obj_file是包含可动态载入对象的文件名,而 link_symbol是函数的链接符号,也就是 C 语言源代码中函数的名称。如果省略链接符号,则假定它与被定义的 SQL 函数同名。

attribute

指定函数可选信息的传统方式。这里可以出现下列属性:

isStrict

等价于STRICT或RETURNS NULL ON NULL INPUT

isCachable

isCachable是IMMUTABLE的已废弃等价物;出于向后兼容的原因它仍被接受。

属性名不区分大小写。

注意

关于编写函数的更多信息,请参考第 33.3 节。

输入参数和返回值允许使用完整的SQL类型语法。但是,类型规范的某些细节(例如numeric类型的精度字段)由底层函数实现负责,CREATE FUNCTION命令会静默地忽略它们(即不识别也不强制执行)。

PostgreSQL允许函数重载;也就是说,只要几个不同函数的参数类型不同,它们就可以使用同一个名称。但是,所有函数的 C 名称必须不同,因此你必须给重载的 C 函数起不同的 C 名(例如,把参数类型用作 C 名的一部分)。

当多次CREATE FUNCTION调用引用同一个对象文件时,该文件只会被装载一次。要卸载并重新装载该文件(也许是在开发期间),可以使用LOAD命令。

使用DROP FUNCTION 删除用户定义的函数。

函数定义中的任何单引号或反斜杠都必须通过双写来转义。

要能够定义函数,用户必须具有该语言上的USAGE权限。

示例

这里有一个帮助你入门的简单示例。更多信息和示例见第 33.3 节。

CREATE FUNCTION add(integer, integer) RETURNS integer
    AS 'select $1 + $2;'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;

安全地编写SECURITY DEFINER函数

由于SECURITY DEFINER函数以创建它的用户的权限执行,需要小心确保函数不被滥用。出于安全考虑,应把search_path设置为排除任何可被不受信任用户写入的模式。这可以防止恶意用户创建遮蔽函数所用对象的对象。在这方面特别重要的是临时表模式,它默认最先被搜索,而且通常任何人都可以写。可以通过强制临时模式最后被搜索来获得安全的安排。为此,把pg_temp写成search_path中的最后一项。下面的函数展示了安全用法:

CREATE FUNCTION check_password(TEXT, TEXT)
RETURNS BOOLEAN AS '
DECLARE passed BOOLEAN;
        old_path TEXT;
BEGIN
        -- Save old search_path; notice we must qualify current_setting
        -- to ensure we invoke the right function
        old_path := pg_catalog.current_setting(''search_path'');

        -- Set a secure search_path: trusted schemas, then ''pg_temp''.
        -- We set is_local = true so that the old value will be restored
        -- in event of an error before we reach the function end.
        PERFORM pg_catalog.set_config(''search_path'', ''admin, pg_temp'', true);

        -- Do whatever secure work we came for.
        SELECT  (pwd = $2) INTO passed
        FROM    pwds
        WHERE   username = $1;

        -- Restore caller''s search_path
        PERFORM pg_catalog.set_config(''search_path'', old_path, true);

        RETURN passed;
END;
' LANGUAGE plpgsql SECURITY DEFINER;

兼容性

CREATE FUNCTION命令在 SQL99 中定义。 PostgreSQL的版本与之类似但不完全兼容。属性不可移植,各种可用语言也一样。

提交更正

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