PostgreSQL7.0手冊-用戶手冊-19. SQL命令-CREATE FUNCTION
2019-09-08 23:33:00
供稿:網友
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
函數參數的數據類型.輸入類型可以是基本類型,組合類型或者 opaque。opaque 表明該函數接受一個非法的象 char * 這樣的類型。.
rtype
返回數據類型.輸入類型可以是基本類型,組合類型,setof type或者 opaque。setof 修改器表示該函數將返回套條目,而不是單條條目。
attribute
一個關于函數的可選信息,用于優化。目前唯一支持的屬性是 iscachable。iscachable 表示此函數在輸入相同時總是返回相同的值(也就是說,它不做數據庫查找或者是使用沒有直接在它的參數列表出現的信息)。優化器使用 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