| PostgreSQL | ||
|---|---|---|
| 上一頁 | 下一頁 | |
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'
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;
}
CREATE FUNCTION 是 Postgres 語言的擴展。
注意: 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 |