PostgreSQL7.0手冊-用戶手冊-19. SQL命令-CREATE FUNCTION
2019-09-08 23:33:00
供稿:網(wǎng)友
CREATE FUNCTION
名稱
CREATE FUNCTION ― 定義一個(gè)新函數(shù)
語法
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
要創(chuàng)建的函數(shù)名.
ftype
函數(shù)參數(shù)的數(shù)據(jù)類型.輸入類型可以是基本類型,組合類型或者 opaque。opaque 表明該函數(shù)接受一個(gè)非法的象 char * 這樣的類型。.
rtype
返回?cái)?shù)據(jù)類型.輸入類型可以是基本類型,組合類型,setof type或者 opaque。setof 修改器表示該函數(shù)將返回套條目,而不是單條條目?!?
attribute
一個(gè)關(guān)于函數(shù)的可選信息,用于優(yōu)化。目前唯一支持的屬性是 iscachable。iscachable 表示此函數(shù)在輸入相同時(shí)總是返回相同的值(也就是說,它不做數(shù)據(jù)庫查找或者是使用沒有直接在它的參數(shù)列表出現(xiàn)的信息)。優(yōu)化器使用 iscachable 來認(rèn)知對該函數(shù)的調(diào)用進(jìn)行預(yù)先計(jì)算是否安全?!?
definition
一個(gè)定義函數(shù)的字串;其含義取決于(用的)語言??梢允且粋€(gè)內(nèi)部函數(shù)名,一個(gè)指向一個(gè)目標(biāo)文件的路徑,一個(gè)SQL查詢或者一種過程語言的文本?!?
obj_file , link_symbol
這種形式的 AS 子句用于動態(tài)鏈接的 C 語言函數(shù),這時(shí)該函數(shù)在 C 源代碼里的名稱和 SQL 函數(shù)的名稱不同。字符串 obj_file 是含有可動態(tài)裝載的對象的文件名,而 link_symbol 是對象的鏈接符號,這個(gè)符號與 C 源代碼里的函數(shù)名相同?!?
langname
可以是 'C','sql','internal' 或 'plname',這里 'plname' 是所創(chuàng)建過程的語言名.參考 CREATE LANGUAGE 獲取詳細(xì)信息.
輸出
CREATE
命令成功地執(zhí)行返回的信息.
描述
CREATE FUNCTION 允許一個(gè) Postgres 用戶在一個(gè)數(shù)據(jù)庫里注冊一個(gè)函數(shù).同樣這個(gè)用戶將被看作這個(gè)函數(shù)的所有者.
注意
請參閱PostgreSQL 程序員手冊 關(guān)于通過函數(shù)擴(kuò)展 Postgres 的章節(jié)獲取更多關(guān)于書寫外部函數(shù)的信息.Use DROP FUNCTION to remove user-defined functions.
Postgres 允許函數(shù)“重載”;也就是說,同一個(gè)函數(shù)名可以用于幾個(gè)不同的函數(shù),只要它們的參數(shù)可以區(qū)分它們。不過,這個(gè)功能在用于 INTERNAL 和 C 語言的函數(shù)時(shí)要小心?!?
允許輸入?yún)?shù)和返回值使用全部 SQL92 類型語法.不過,有些類型聲明的細(xì)節(jié)(例如, numeric 類型的精度域)是由下面的函數(shù)實(shí)現(xiàn)負(fù)責(zé)的,并且被 CREATE FUNCTION 命令悄悄的吞并了(也就是說,不再被識別或強(qiáng)制).
兩個(gè)內(nèi)部函數(shù)擁有相同 C 名稱時(shí)肯定會發(fā)生鏈接時(shí)錯(cuò)誤。要解決這個(gè)問題,賦予它們不同的 C 名稱(例如,使用參數(shù)類型做為 C 名稱的一部分),然后在 CREATE FUNCTION 的 AS 子句里面聲明這些名字。如果 AS 子句為空,那么 CREATE FUNCTION 假設(shè)函數(shù)的 C 名稱與SQL名稱一樣?!?
如果用 C 語言函數(shù)重載 SQL 函數(shù),給每個(gè) C 語言函數(shù)的實(shí)例一個(gè)獨(dú)立的名稱,并且使用 CREATE FUNCTION 語法里的 AS 子句的不同形式來確保重載的 SQL 函數(shù)名稱正確地解釋為相應(yīng)動態(tài)鏈接對象?!?
函數(shù)不能返回一套數(shù)值(結(jié)果).
用法
創(chuàng)建一個(gè)簡單的 SQL 函數(shù):
CREATE FUNCTION one() RETURNS int4
AS 'SELECT 1 AS RESULT'
LANGUAGE 'sql';
SELECT one() AS answer;
answer
--------
1
這個(gè)例子通過調(diào)用一個(gè)用戶創(chuàng)建的共享庫的路徑創(chuàng)建一個(gè) C 函數(shù).該路徑計(jì)算一個(gè)檢測位并且如果函數(shù)參數(shù)里的檢測位正確就返回一個(gè) TRUE?。@些是通過使用一個(gè) CHECK 約束實(shí)現(xiàn)的.
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))
);
這個(gè)例子創(chuàng)建一個(gè)在用戶定義類型 complex 和內(nèi)部類型 point 之間做類型轉(zhuǎn)換的函數(shù)。該函數(shù)是用一個(gè)從 C 源代碼編譯的動態(tài)裝載的對象來實(shí)現(xiàn)的。對于 Postgres 而言,要自動尋找類型轉(zhuǎn)換函數(shù),sql 函數(shù)必須和返回類型同名,而且不能重載。該函數(shù)名通過使用 SQL定義里 AS 子句的第二種類型來重載
CREATE FUNCTION point(complex) RETURNS point
AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
LANGUAGE 'c';
該函數(shù)的 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 語言的擴(kuò)展.
SQL/PSM
注意: PSM 表示連續(xù)存儲模塊?。≒ersistent Stored Modules).它是一個(gè)過程化的語言,最初希望 PSM 將在1996年晚些時(shí)候正式批準(zhǔn)為官方標(biāo)準(zhǔn).但到了 1998年中,這些還沒有成為現(xiàn)實(shí),但 PSM 有希望最終成為一個(gè)標(biāo)準(zhǔn).
SQL/PSM CREATE FUNCTION 語法如下:
CREATE FUNCTION name
( [ [ IN | OUT | INOUT ] type [, ...] ] )
RETURNS rtype
LANGUAGE 'langname'
ESPECIFIC routine
SQL-statement