您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

CREATE FUNCTION

Name

CREATE FUNCTION  --  定义一个新函数

Synopsis

CREATE [ 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 将要么创建一个新函数, 要么替换现有的定义.

参数

name

要创建的函数名字.这个名字可以不是唯一的, 因为函数可以重载,胆识同名的函数必须有不同的参数类型.

argtype

该函数的数据类型(如果有).输入类型可以是基本类型,也可以是 复合类型, opaque ,或者和一个现有字段相同的类型. Opaque 表示该函数接受非 SQL 类型,比如 char * . 一个字段的类型是用 tablename . columnname %TYPE 表示的;使用这个东西可以帮助函数独立于表定义的修改.

rettype

返回数据类型.输出类型可以声明为一个基本类型,复合类型, setof 类型, opaque , 或者和现有字段同类型. setof 修饰词表示该函数将返回一套条目, 而不是一条条目.返回类型声明为 opaque 的函数不返回数值.它们不能直接调用;触发器函数可以利用这个 特性.

definition

一个定义函数的字串;含义取决于语言.它可以是一个内部函数名字, 一个指向某个目标文件的路径,一个 SQL 查询,或者一个用过程语言 写的文本.

obj_file , link_symbol

这个形式的 AS 子句用于在函数的 C 源文件 名字和 SQL 函数的名字不同的时候动态联接 C 语言函数. 字串 obj_file 是包含可动态装载的对象的文件名,而 link_symbol 是对象的联接符号,也就是该函数在 C 源文件列的名字.

langname

可以是 SQL C internal ,或者 plname ,这里的 plname 是一种已创建过程语言的名字. 参阅 CREATE LANGUAGE 获取细节. 为了保持向下兼容,该名字可以用单引号包围.

attribute

一段可选的有关该函数的信息,用于优化.见下文获取细节.

创建该函数的用户成为该函数所有者.

下面的属性可以出现在 WITH 子句里∶

iscachable

Iscachable 表示此函数在输入 相同时总是返回相同的值 (也就是说, 它不做数据库查找或者是使用没有直接在它的参数列表出现的信息)。 优化器使用 iscachable 来认知对该函数的调用进行预先计算是否安全。

isstrict

isstrict 表明如果它的任何参数是 NULL,此函数总是返回 NULL. 如果声明了这个属性,则如果存在 NULL 参数时不会执行该函数; 而只是自动假设一个 NULL 结果.如果没有声明 isstrict 该函数将为 NULL 输入调用并进行处理. 那么剩下的事就是函数作者的责任来检查 NULL 是否必须并且做相应响应.

注意

请参阅 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;
}

兼容性

在 SQL99 里的确定义了一个 CREATE FUNCTION PostgreSQL 的和它类似但是不兼容. 这个属性是不可移植的,可以使用的不同语言也是如此.

又见

DROP FUNCTION , LOAD , PostgreSQL程序员手册