CREATE FUNCTION
Name
CREATE FUNCTION — 定义一个新函数
CREATE FUNCTION name ( [ ftype [, ...] ] )
RETURNS rtype
AS definition
LANGUAGE 'langname'
[ WITH ( attribute [, ...] ) ]
CREATE FUNCTION name ( [ ftype [, ...] ] )
RETURNS rtype
AS obj_file , link_symbol
LANGUAGE 'langname'
[ WITH ( attribute [, ...] ) ]
输入
-
name
-
要创建的函数名.
-
ftype
-
函数参数的数据类型.输入类型可以是基本类型,组合类型或者 opaque。 Opaque 表明该函数接受一个非 SQL 类型,比如象 char * 这样的类型。
-
rtype
-
返回数据类型.输入类型可以是基本类型,组合类型, setof type, 或者 opaque。 setof 修饰词表示该函数 将返回一套条目,而不是单条条目。
-
attribute
-
一个关于函数的可选信息,用于优化。参阅下文获取细节.
-
definition
-
一个定义函数的字串;其含义取决于(用的)语言。 可以是一个内部函数名,一个指向一个目标文件的路径,一 个SQL查询或者一种过程语言的文本。
-
obj_file
, link_symbol
-
这种形式的 AS 子句用于动态链接的 C 语言函数, 这时该函数在 C 源代码里的名称和 SQL 函数的名称不同。字符串 obj_file 是含有可动态装载的对象的文件名,而 link_symbol是对象的链接符号, 这个符号与 C 源代码里的函数名相同。
-
langname
-
可以是 'sql'?'C', 'internal' 或 'plname',这里 'plname' 是所创建过程的语言名.参考 CREATE LANGUAGE 获取详细信息.
描述
CREATE FUNCTION 允许一个 Postgres 用户在一个数据库里注册一个函数. 并且这个用户将被看作这个函数的所有者.
函数属性
WITH 子句里可以出现下面的内容:
- iscachable
-
iscachable 表示此函数在输入 相同时总是返回相同的值 (也就是说, 它不做数据库查找或者是使用没有直接在它的参数列表出现的信息)。 优化器使用 iscachable 来认知对该函数的调用进行预先计算是否安全。
- isstrict
-
isstrict 表明如果它的任何参数是 NULL,此函数总是返回 NULL. 如果声明了这个属性,则如果存在 NULL 参数时不会执行该函数; 而只是自动假设一个 NULL 结果.如果没有声明 isstrict 该函数将为 NULL 输入调用并进行处理. 那么剩下的事就是函数作者的责任来检查 NULL 是否必须并且做相应响应.
注意
请参阅 PostgreSQL 程序员手册 关于通过函数扩展 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 函数名称正确地解释为相应动态链接对象。
用法
创建一个简单的 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 FUNCTION name
( [ [ IN | OUT | INOUT ] type [, ...] ] )
RETURNS rtype
LANGUAGE 'langname'
ESPECIFIC routineSQL-statement
|----------------------------------------------------------------------------------------|
版权声明 版权所有 @zhyiwww
引用请注明来源 http://www.blogjava.net/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2006-06-02 18:49
zhyiwww 阅读(1517)
评论(0) 编辑 收藏 所属分类:
database