CREATE FUNCTION name ( [ ftype [, ...] ] ) RETURNS rtype AS definition LANGUAGE 'langname' [ WITH ( attribute [, ...] ) ] CREATE FUNCTION name ( [ ftype [, ...] ] ) RETURNS rtype AS obj_file , link_symbol LANGUAGE 'C' [ WITH ( attribute [, ...] ) ]
Postgres 允许函数“重载”;也就是说,同一个函数名可以用于几个不同的函数,只要它们的参数可以区分它们。不过,这个功能在用于 INTERNAL 和 C 语言的函数时要小心。
允许输入参数和返回值使用全部 SQL92 类型语法.不过,有些类型声明的细节(例如, numeric 类型的精度域)是由下面的函数实现负责的,并且被 CREATE FUNCTION 命令悄悄的吞并了(也就是说,不再被识别或强制).
两个内部函数拥有相同 C 名称时肯定会发生链接时错误。要解决这个问题,赋予它们不同的 C 名称(例如,使用参数类型做为 C 名称的一部分),然后在 CREATE FUNCTION 的 AS 子句里面声明这些名字。如果 AS 子句为空,那么 CREATE FUNCTION 假设函数的 C 名称与SQL名称一样。
如果用 C 语言函数重载 SQL 函数,给每个 C 语言函数的实例一个独立的名称,并且使用
CREATE
FUNCTION 语法里的 AS 子句的不同形式来确保重载的 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; }
注意: PSM 表示连续存储模块 (Persistent Stored Modules).它是一个过程化的语言,最初希望 PSM 将在1996年晚些时候正式批准为官方标准.但到了 1998年中,这些还没有成为现实,但 PSM 有希望最终成为一个标准.
CREATE FUNCTION name ( [ [ IN | OUT | INOUT ] type [, ...] ] ) RETURNS rtype LANGUAGE 'langname' ESPECIFIC routine SQL-statement