| PostgreSQL | ||
|---|---|---|
| 上一页 | 下一页 | |
CREATE FUNCTION — 定义一个新函数
CREATE FUNCTION name ( [ ftype [, ...] ] )
RETURNS rtype
[ WITH ( attribute [, ...] ) ]
AS definition
LANGUAGE 'langname'
CREATE FUNCTION name ( [ ftype [, ...] ] )
RETURNS rtype
[ WITH ( attribute [, ...] ) ]
AS obj_file , link_symbol
LANGUAGE 'C'
CREATE FUNCTION 允许一个 Postgres 用户在一个数据库里注册一个函数.同样这个用户将被看作这个函数的所有者.
请参阅PostgreSQL 程序员手册 关于通过函数扩展 Postgres 的章节获取更多关于书写外部函数的信息.
使用 DROP 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 bool
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;
}
CREATE FUNCTION 是 Postgres 语言的扩展.
注意: PSM 表示连续存储模块 (Persistent Stored Modules).它是一个过程化的语言,最初希望 PSM 将在1996年晚些时候正式批准为官方标准.但到了 1998年中,这些还没有成为现实,但 PSM 有希望最终成为一个标准.
SQL/PSM CREATE FUNCTION 语法如下:
CREATE FUNCTION name
( [ [ IN | OUT | INOUT ] type [, ...] ] )
RETURNS rtype
LANGUAGE 'langname'
ESPECIFIC routine
SQL-statement
| 上一页 | 首页 | 下一页 |
| CREATE DATABASE | 开头 | CREATE GROUP |