CREATE FUNCTION(7) SQL Commands CREATE FUNCTION(7)

CREATE FUNCTION - 定義一個新函式

CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )

RETURNS rettype
{ LANGUAGE langname
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
| AS 'definition'
| AS 'obj_file', 'link_symbol'
} ...
[ WITH ( attribute [, ...] ) ]

CREATE FUNCTION 定義一個新的函式。 CREATE OR REPLACE FUNCTION 將要麼建立一個新函式, 要麼替換現有的定義。


如果包含了一個模式名,那麼函式就在指定的模式中建立。否則它會在當前模式中建立。 新函式的名字不能和同一個模式中的任何帶有同樣引數型別的函式同名。 不過,引數型別不同的函式可以同名(這叫做過載)。


要更新一個現有函式的定義,使用 CREATE OR REPLACE FUNCTION。 我們不能用這個方法修改一個函式的名字或者引數型別(如果你這麼幹,那麼你就會建立一個新的,不同的函式)。 同樣,CREATE OR REPLACE FUNCTION 也不會允許你修改一個現有函式的返回型別。 要做這些事情,你必須刪除並重新建立函式。


如果你刪除然後重建一個函式,新函式和舊的將是不同的實體;你會破壞現有規則,檢視,觸發器等等。 使用 CREATE OR REPLACE FUNCTION 可以在不破壞引用該函式的物件的前提下修改函式定義。


建立這個函式的使用者成為函式的所有者。


要建立的函式名字。

該函式的資料型別(可以有模式修飾)。如果有的話,引數型別可以是基本型別,也可以是複合型別,域型別,或者和一個現有欄位相同的型別。


一個欄位的型別是用 tablename.columnname%TYPE 表示的;使用這個東西可以幫助函式獨立於表定義的修改。


根據實現語言的不同,我們還可以在這上面宣告 "偽型別", 比如 cstring。偽型別表示實際的引數型別要麼是沒有完整地宣告,要麼是在普通的 SQL 資料型別之外。


返回資料型別。輸出型別可以宣告為一個基本型別,複合型別,域型別, 或者從現有欄位複製。參閱上面 argtype 的描述獲取如何引用一個現有型別的資訊。


根據實現語言的不同,我們還可以在這上面宣告 "偽型別", 比如 cstring。 SETOF 修飾詞表示該函式將返回一套條目, 而不是一條條目。


用以實現函式的語言的名字。 可以是 SQL,C, internal,或者是使用者定義的過程語言名字。 (又見 createlang。 ) 為了保持向下相容,該名字可以用單引號包圍。

這些屬性告訴系統把對該函式的多次呼叫替換成一次是否安全。 主要用於執行時最佳化。 至少應該宣告一個選擇。如果任何一個都沒有出現,那麼 VOLATILE 是預設假設。

IMMUTABLE 表示該函式在給出同樣的引數值時總是返回相同的結果; 也就是說,它不做資料庫查詢或者是使用那些並沒有直接出現在其引數列表裡面的資訊。 如果給出這個選項,那麼任何帶著全部是常量引數對該函式的呼叫都將立即替換為該函式的值。

STABLE 表示在一次表掃描裡,對相同引數值, 該函式將穩定返回相同的值,但是它的結果可能在不同 SQL 語句之間變化。 這個選項對那些結果倚賴資料庫查詢,引數變數(比如當前時區),等等的函式是很合適的。 還要注意 current_timestamp 族函式是 stable (穩定)的,因為它們的值在一次事務中不會變化。

VOLATILE 表示該函式值甚至可以在一次表掃描內改變, 因此不會做任何最佳化。很少資料庫函式在這個概念上是易變的; 一些例子是 random(),currval(), timeofday()。請注意任何有副作用的函式都必需列為易變類, 即使其結果相當有規律也應該這樣,這樣才能避免它被最佳化;一個例子就是 setval()。

CALLED ON NULL INPUT (預設)表明該函式在自己的某些引數是空值的時候還是可以按照正常的方式呼叫。 剩下的事情是函式的作者必須負責檢查空值以及相應地做出反應。

RETURNS NULL ON NULL INPUT 或 STRICT 表明如果它的任何引數是 NULL,此函式總是返回 NULL。 如果聲明瞭這個引數,則如果存在 NULL 引數時不會執行該函式; 而只是自動假設一個 NULL 結果。

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER
SECURITY INVOKER 表明該函式將帶著呼叫它的使用者的許可權執行。 這是預設。SECURITY DEFINER 宣告該函式將以建立它的使用者的許可權執行。


關鍵字 EXTERNAL 的目的是和 SQL 相容, 但是我們和 SQL 不同的是,這個特性不僅僅適用於外部的函式, 所以它是可選的。


一個定義函式的字串;含義取決於語言。它可以是一個內部函式名字, 一個指向某個目標檔案的路徑,一個 SQL 查詢,或者一個用過程語言寫的文字。

這個形式的 AS 子句用於在函式的 C 原始檔裡的函式名字和 SQL 函式的名字不同的時候可動態裝載 C 語言函式。 字串 obj_file 是包含可動態裝載的物件的檔名,而 link_symbol 是函式的連結符號,也就是該函式在 C 原始檔裡的名字。 如果省略了連結符號,那麼就假設它和被定義的 SQL 函式同名。

歷史遺留的函式可選資訊。下面的屬性可以在此出現:

等效於 STRICT 或者 RETURNS NULL ON NULL INPUT
isCachable 是 IMMUTABLE 的過時的等效物;不過出於向下相容,我們仍然接受它。


屬性名是大小寫無關的。


請參閱 ``User-Defined Functions'' 獲取更多關於書寫函式的資訊。


我們允許你將完整的 SQL 型別語法用於輸入引數和返回值。 不過,有些型別宣告的細節(比如,numeric 型別的精度域)是由下層函式實現負責的, 並且會被 CREATE FUNCTION 命令悄悄地吞掉。 (也就是說,不再被識別或強制)。

PostgreSQL 允許函式過載; 也就是說,同一個函式名可以用於幾個不同的函式, 只要它們的引數可以區分它們。不過,所有函式的 C 名字必須不同, 也就是說你必須給予過載的 C 函式不同的 C 名字(比如,使用引數型別作為 C 名字的一部分)。


如果重複呼叫 CREATE FUNCTION,並且都指向同一個目標檔案, 那麼該檔案只裝載一次。要解除安裝和恢復裝載該檔案(可能是在開發過程中),你可以使用 LOAD [load(7)] 命令。


使用 DROP FUNCTION 刪除一個使用者定義函式。


函式定義裡面的任何單引號或者反斜槓都必須用寫雙份的方式逃逸。


要能定義函式,使用者必須對該語言有 USAGE 許可權。


這裡是一個簡單的例子,用於幫助你開始掌握這個命令。 更多資訊和例子,參閱 ``User-Defined Functions''。

CREATE FUNCTION add(integer, integer) RETURNS integer

AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;


在 SQL99 裡的確定義了一個CREATE FUNCTION PostgreSQL 的和它類似但是不相容。 這個屬性是不可移植的,可以使用的不同語言也是如此。

ALTER FUNCTION [alter_function(7)], DROP FUNCTION [drop_function(7)], GRANT [grant(7)], LOAD [load(7)], REVOKE [revoke(7)], createlang(1)

譯者

Postgresql 中文網站 何偉平 <laser@pgsqldb.org>

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

2003-11-02 SQL - Language Statements