CREATE FUNCTION
CREATE FUNCTION — 定义一个新函数
大纲
CREATE FUNCTIONname( [ftype[, ...] ] ) RETURNSrtypeASdefinitionLANGUAGE 'langname' [ WITH (attribute[, ...] ) ] CREATE FUNCTIONname( [ftype[, ...] ] ) RETURNSrtypeASobj_file,link_symbolLANGUAGE 'langname' [ WITH (attribute[, ...] ) ]
输入
name要创建的函数的名称。
ftype函数参数的数据类型(如果有的话)。输入类型可以是基本类型或复合类型,或者opaque。
Opaque表示函数接受非 SQL 类型的参数,例如char *。rtype返回数据类型。输出类型可以指定为基本类型、复合类型、
setof 类型或opaque。setof修饰符表示该函数将返回一组结果项,而不是单个项。attribute关于函数的一条可选信息,用于优化。详见下文。
definition定义函数的字符串;其含义取决于语言。它可以是内部函数名、对象文件的路径、SQL 查询,或者过程语言中的文本。
obj_file,link_symbol当 C 语言源代码中的函数名与 SQL 函数名不同时,动态链接的 C 语言函数使用这种形式的
AS子句。字符串obj_file是包含可动态载入对象的文件名,而link_symbol是对象的链接符号,也就是 C 语言源代码中函数的名称。langname可以是 '
sql'、'C'、'internal',或者 'plname',其中 'plname' 是一种已创建过程语言的名称。详见 CREATE LANGUAGE 。
输出
CREATE如果命令成功完成,就返回这个结果。
描述
CREATE FUNCTION允许
Postgres用户向数据库注册一个函数。随后,这个用户被视为该函数的拥有者。
函数属性
下列条目可以出现在 WITH 子句中:
- iscachable
Iscachable表示该函数在给定相同参数值时总是返回相同结果(也就是说,它不做数据库查找,也不使用不直接出现在其参数列表中的信息)。优化器利用iscachable来判断预计算该函数的一次调用是否安全。- isstrict
isstrict表示只要任一参数为 NULL,函数就总是返回 NULL。如果指定了这个属性,当存在 NULL 参数时函数不会被执行;而是自动假定结果为 NULL。当未指定isstrict时,函数将针对 NULL 输入被调用。此时如有必要,由函数作者负责检查 NULL 并做出适当响应。
注意
关于编写外部函数的更多信息,请参考 PostgreSQL Programmer's Guide 中关于通过函数扩展 Postgres主题的章节。
使用DROP FUNCTION
删除用户定义的函数。
输入参数和返回值允许使用完整的SQL92类型语法。但是,类型规范的某些细节(例如
numeric类型的精度字段)由底层函数实现负责,CREATE FUNCTION命令会静默地忽略它们(即不识别也不强制执行)。
Postgres允许函数"重载";也就是说,只要几个不同函数的参数类型不同,它们就可以使用同一个名称。但对 internal 和 C 语言函数,必须谨慎使用这一设施。
两个internal
函数如果 C 名相同,会在链接时引发错误。要解决这个问题,可以给它们起不同的 C 名(例如,把参数类型用作 C 名的一部分),然后在CREATE FUNCTION的 AS 子句中指定这些名字。如果 AS 子句留空,则CREATE FUNCTION
假定函数的 C 名与 SQL 名相同。
类似地,当用多个 C 语言函数重载 SQL 函数名时,给函数的每个 C 语言实例起一个不同的名字,然后在
CREATE FUNCTION语法中使用AS子句的另一种形式,为每个重载的 SQL 函数选择合适的 C 语言实现。
用法
创建一个简单的 SQL 函数:
CREATE FUNCTION one() RETURNS int4
AS 'SELECT 1 AS RESULT'
LANGUAGE 'sql';
SELECT one() AS answer;
answer
--------
1
这个示例通过调用一个用户创建的共享库中的例程来创建一个 C 函数。这个特定的例程计算一个校验位,如果函数参数中的校验位正确就返回 TRUE。它用于 CHECK 约束中。
CREATE FUNCTION ean_checkdigit(bpchar, bpchar) RETURNS boolean
AS '/usr1/proj/bray/sql/funcs.so' LANGUAGE 'c';
CREATE TABLE product (
id char(8) PRIMARY KEY,
eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}')
REFERENCES brandname(ean_prefix),
eancode char(6) CHECK (eancode ~ '[0-9]{6}'),
CONSTRAINT ean CHECK (ean_checkdigit(eanprefix, eancode))
);
这个示例创建一个在用户定义类型 complex 与内部类型 point 之间做类型转换的函数。该函数由一个从 C 源码编译出的动态载入对象实现。为了让Postgres自动找到类型转换函数,SQL 函数必须与返回类型同名,因此重载不可避免。在 SQL 定义中使用AS子句的第二种形式来重载函数名:
CREATE FUNCTION point(complex) RETURNS point
AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
LANGUAGE 'c';
该函数的 C 声明是:
Point * complex_to_point (Complex *z)
{
Point *p;
p = (Point *) palloc(sizeof(Point));
p->x = z->x;
p->y = z->y;
return p;
}
兼容性
SQL92
CREATE FUNCTION是
Postgres语言扩展。
SQL/PSM
注意
PSM 表示持久存储模块(Persistent Stored Modules)。它是一种过程语言。SQL/PSM 是一个支持函数可扩展性的标准。
SQL/PSM CREATE FUNCTION的语法如下:
CREATE FUNCTIONname( [ [ IN | OUT | INOUT ]type[, ...] ] ) RETURNSrtypeLANGUAGE 'langname' ESPECIFICroutineSQL-statement