CREATE FUNCTION(7) | SQL Commands | CREATE FUNCTION(7) |
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
可以在不破坏引用该函数的对象的前提下修改函数定义。
创建这个函数的用户成为函数的所有者。
一个字段的类型是用
tablename.columnname%TYPE
表示的;使用这个东西可以帮助函数独立于表定义的修改。
根据实现语言的不同,我们还可以在这上面声明
"伪类型", 比如
cstring。伪类型表示实际的参数类型要么是没有完整地声明,要么是在普通的
SQL 数据类型之外。
根据实现语言的不同,我们还可以在这上面声明
"伪类型", 比如
cstring。 SETOF
修饰词表示该函数将返回一套条目,
而不是一条条目。
IMMUTABLE 表示该函数在给出同样的参数值时总是返回相同的结果; 也就是说,它不做数据库查找或者是使用那些并没有直接出现在其参数列表里面的信息。 如果给出这个选项,那么任何带着全部是常量参数对该函数的调用都将立即替换为该函数的值。
STABLE 表示在一次表扫描里,对相同参数值, 该函数将稳定返回相同的值,但是它的结果可能在不同 SQL 语句之间变化。 这个选项对那些结果倚赖数据库查找,参数变量(比如当前时区),等等的函数是很合适的。 还要注意 current_timestamp 族函数是 stable (稳定)的,因为它们的值在一次事务中不会变化。
VOLATILE 表示该函数值甚至可以在一次表扫描内改变, 因此不会做任何优化。很少数据库函数在这个概念上是易变的; 一些例子是 random(),currval(), timeofday()。请注意任何有副作用的函数都必需列为易变类, 即使其结果相当有规律也应该这样,这样才能避免它被优化;一个例子就是 setval()。
RETURNS NULL ON NULL INPUT 或 STRICT 表明如果它的任何参数是 NULL,此函数总是返回 NULL。 如果声明了这个参数,则如果存在 NULL 参数时不会执行该函数; 而只是自动假设一个 NULL 结果。
关键字 EXTERNAL
的目的是和 SQL 兼容,
但是我们和 SQL
不同的是,这个特性不仅仅适用于外部的函数,
所以它是可选的。
属性名是大小写无关的。
请参阅 ``User-Defined Functions'' 获取更多关于书写函数的信息。
我们允许你将完整的 SQL
类型语法用于输入参数和返回值。
不过,有些类型声明的细节(比如,numeric
类型的精度域)是由下层函数实现负责的,
并且会被 CREATE FUNCTION
命令悄悄地吞掉。
(也就是说,不再被识别或强制)。
PostgreSQL 允许函数重载; 也就是说,同一个函数名可以用于几个不同的函数, 只要它们的参数可以区分它们。不过,所有函数的 C 名字必须不同, 也就是说你必须给予重载的 C 函数不同的 C 名字(比如,使用参数类型作为 C 名字的一部分)。
如果重复调用 CREATE
FUNCTION,并且都指向同一个目标文件,
那么该文件只装载一次。要卸载和恢复装载该文件(可能是在开发过程中),你可以使用
LOAD [load(7)] 命令。
使用 DROP FUNCTION
删除一个用户定义函数。
函数定义里面的任何单引号或者反斜杠都必须用写双份的方式逃逸。
要能定义函数,用户必须对该语言有
USAGE 权限。
这里是一个简单的例子,用于帮助你开始掌握这个命令。 更多信息和例子,参阅 ``User-Defined Functions''。
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
在 SQL99 里的确定义了一个CREATE FUNCTION PostgreSQL 的和它类似但是不兼容。 这个属性是不可移植的,可以使用的不同语言也是如此。
ALTER FUNCTION [alter_function(7)], DROP FUNCTION [drop_function(7)], GRANT [grant(7)], LOAD [load(7)], REVOKE [revoke(7)], createlang(1)
Postgresql 中文网站 何伟平 <laser@pgsqldb.org>
本页面中文版由中文
man 手册页计划提供。
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
2003-11-02 | SQL - Language Statements |