PostgreSQL
上一頁   下一頁

CREATE FUNCTION

名稱

CREATE FUNCTION ─ 定義一個新函數

CREATE FUNCTION name ( [ ftype [, ...] ] )
    RETURNS rtype
    [ WITH ( attribute [, ...] ) ]
    AS definition   
    LANGUAGE 'langname'


CREATE FUNCTION name ( [ ftype [, ...] ] )
    RETURNS rtype
    [ WITH ( attribute [, ...] ) ]
    AS obj_file , link_symbol  
    LANGUAGE 'C'
  

輸入

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 的章節獲取更多關於書寫外部函數的資訊。

使用 DROP FUNCTION 刪除用戶定義函數。

Postgres 允許函數“重載”﹔也就是說,同一個函數名可以用於幾個不同的函數,只要它們的參數可以區分它們。不過,這個功能在用於 INTERNAL 和 C 語言的函數時要小心。

兩個 internal 函數擁有相同 C 名稱時肯定會發生鏈接時錯誤。要解決這個問題,賦予它們不同的 C 名稱(例如,使用參數型態做為 C 名稱的一部分),然後在 CREATE FUNCTION 的AS子句裡面聲明這些名字。如果 AS 子句為空,那麼 CREATE FUNCTION 假設函數的 C 名稱與SQL名稱一樣。

如果用 C 語言函數重載 SQL 函數,給每個 C 語言函數的實例一個獨立的名稱,並且使用 CREATE FUNCTION 語法裡的 AS 子句的不同形式來確保重載的 SQL 函數名稱正確地解釋為相應動態鏈接對像。

C 函數不能返回一套數值(結果)。

用法

創建一個簡單的 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
    

上一頁 首頁 下一頁
CREATE DATABASE 開頭 CREATE GROUP