|
CREATE FUNCTIONSynopsisCREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype AS ' definition ' LANGUAGE ' langname ' [ WITH ( attribute [, ...] ) ] CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype AS ' obj_file ' , ' link_symbol ' LANGUAGE langname [ WITH ( attribute [, ...] ) ] 描述CREATE FUNCTION 定义一个新的函数. CREATE OR REPLACE FUNCTION 将要么创建一个新函数, 要么替换现有的定义.
参数
创建该函数的用户成为该函数所有者. 下面的属性可以出现在 WITH 子句里∶
注意请参阅 PostgreSQL 程序员手册 关于通过函数扩展 PostgreSQL 的章节获取更多关于书写外部函数的信息. 我们允许你将完整的 SQL 类型语法用于 输入参数和返回值.不过,有些类型声明的细节(比如, numeric 类型的精度域)是由下层函数实现负责的, 并且会被 CREATE FUNCTION 命令悄悄地吞掉. (也就是说,不再被识别或强制). PostgreSQL 允许函数 重载 ; 也就是说,同一个函数名可以用于几个不同的函数, 只要它们的参数可以区分它们。不过,这个功能在用于 internal(内部)和 C 语言 的函数时要小心。 两个 internal 函数拥有相同 C 名称时肯定会发生链接时错误。 要解决这个问题,给它们赋予不同的 C 名称(例如,使用参数类 型做为 C 名称的一部分),然后在 CREATE FUNCTION 的 AS 子句里面声明这些名字。 如果 AS 子句为空,那么 CREATE FUNCTION 假设函数的 C 名称与SQL名称一样。 类似的还有,如果用多个 C 语言函数重载 SQL 函数, 给每个 C 语言函数的实例一个独立的名称,然后使用 CREATE FUNCTION 语法里的 AS 句的不同形式来选择每个重载的 SQL 函数的正确的 C 语言实现. 如果重复调用 CREATE FUNCTION ,并且都 指向同一个目标文件,那么该文件只装载一次.要卸载和恢复装载 该文件(可能是在开发过程中),你可以使用 LOAD 命令. 使用 DROP FUNCTION 删除一个用户定义函数. 要更新现存函数的定义,用 CREATE OR REPLACE FUNCTION . 请注意不可能用这种方法改变一个函数的名字或者参数类型 (如果你这么干,你只是会创建一个新的,不同的函数). 同样, CREATE OR REPLACE FUNCTION 也不会 让你改变一个现存函数的返回类型.要干这些事,你必须删除并 重新创建该函数. 如果你删除然后重新创建一个函数,新函数和旧的并非相同实体; 你会破坏现存的引用了原有函数的规则,视图,触发器等等. 使用 CREATE OR REPLACE FUNCTION 可以改变一个 函数的定义而又不会破坏引用该函数的对象. 例子要创建一个简单的 SQL 函数∶ CREATE FUNCTION one() RETURNS integer AS 'SELECT 1 AS RESULT;' LANGUAGE SQL; SELECT one() AS answer; answer -------- 1
这个例子通过调用一个用户创建的名为 funcs.so (扩展名因平台而异)的共享库过程创建一个 C 函数. 该共享库文件应该位于服务器的动态搜索路径里. 该路径计算一个检测位并且如果函数参数里的检测位 正确就返回一个 TRUE .这些可以通过用一个 CHECK 约束实现的. CREATE FUNCTION ean_checkdigit(char, char) RETURNS boolean AS 'funcs' 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 源代码编译的 动态装载的对象来实现的。(我们演示了使用声明共享目标文件 的准确路径名的过时方法). 对于 PostgreSQL 而言, 要自动寻找类型转换函数,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; }
|