CREATE FUNCTION

名称

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 'C'
    [ WITH ( attribute [, ...] ) ]

输入

name
要创建的函数名.
ftype
函数参数的数据类型.输入类型可以是基本类型,组合类型或者 opaqueopaque 表明该函数接受一个非法的象 char * 这样的类型。.
rtype
返回数据类型.输入类型可以是基本类型,组合类型,setof type或者 opaquesetof 修改器表示该函数将返回套条目,而不是单条条目。
attribute
一个关于函数的可选信息,用于优化。目前唯一支持的属性是 iscachableiscachable 表示此函数在输入相同时总是返回相同的值(也就是说,它不做数据库查找或者是使用没有直接在它的参数列表出现的信息)。优化器使用 iscachable 来认知对该函数的调用进行预先计算是否安全。
definition
一个定义函数的字串;其含义取决于(用的)语言。可以是一个内部函数名,一个指向一个目标文件的路径,一个SQL查询或者一种过程语言的文本。
obj_file , link_symbol
这种形式的 AS 子句用于动态链接的 C 语言函数,这时该函数在 C 源代码里的名称和 SQL 函数的名称不同。字符串 obj_file 是含有可动态装载的对象的文件名,而 link_symbol 是对象的链接符号,这个符号与 C 源代码里的函数名相同。
langname
可以是 'C','sql','internal' 或 'plname',这里 'plname' 是所创建过程的语言名.参考  CREATE LANGUAGE 获取详细信息.

输出

CREATE
命令成功地执行返回的信息.

描述

CREATE FUNCTION 允许一个 Postgres 用户在一个数据库里注册一个函数.同样这个用户将被看作这个函数的所有者.
 

注意

请参阅PostgreSQL 程序员手册 关于通过函数扩展 Postgres 的章节获取更多关于书写外部函数的信息.Use DROP FUNCTION to remove user-defined functions.

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 函数名称正确地解释为相应动态链接对象。
 

函数不能返回一套数值(结果).

用法

创建一个简单的 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;
}

兼容性

SQL92

CREATE FUNCTION 是 Postgres 语言的扩展.

SQL/PSM

注意: 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