Provided by:
manpages-zh_1.5-1_all 
NAME
CREATE FUNCTION - 定義一虓s函數
SYNOPSIS
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 [, ...] ) ]
DESCRIPTIONyz
CREATE FUNCTION 定義一虓s的函數。 CREATE OR REPLACE FUNCTION 將-
n麼創建一虓s函數, n麼替換現有的定義。
如果包含了一-
蚍狾’W,那麼函數就在指定的模式中創建。否則它會在當前模式中創建。
新函數的名字不能和同一蚍狾﹞云漸籉饃a有同樣參數類型的函數同名。
不過,參數類型不同的函數可以同名(這叫做姜)。
n更新一茞{有函數的定義,使用 CREATE OR REPLACE FUNCTION。 我怳ㄞ鄍帠o-
茪隤k蚹鴾@茖蝻漲W字或者參數類型(如果你這麼幹,那麼你就會創建一-
虓s的,不同的函數)。 同樣,CREATE OR REPLACE FUNCTION 也不會允許你-
蚹鴾@茞{有函數的返回類型。 n做這些事情,你必須刪除並奐s創建函數。
如果你刪除然後垂堣@-
茖蝻A新函數和舊的將是不同的實體;你會破壞現有規則,視圖,觸發器等等。
使用 CREATE OR REPLACE FUNCTION 可以在不破壞引用該函數的對象的前提下-
蚹翵蝻w義。
創建這茖蝻漕洏峈怞足馬蝻漫狾釭怴C
PARAMETERS數
name n創建的函數名字。
argtype
該函數的數據類型(可以有模式-
袡╮^。如果有的話,參數類型可以是基本類型,也可以是復合類型,域類型,或者和一-
茞{有字段相同的類型。
一茼r段的類型是用 tablename.columnname%TYPE 表示的;使用這-
茠F西可以幫助函數獨立於表定義的蚹鵅C
根據實現語言的不同,我攽晱i以在這上掄n明 "偽類型", 比如
cstring。偽類型表示實際的參數類型n麼是沒有完整地聲明,-
n麼是在普通的 SQL 數據類型之外。
rettype
返回數據類型。輸出類型可以聲明為一荌禰酵型,復合類型,域類型,
或者從現有字段拷貝。參閱上 argtype 的描z獲取如何引用一-
茞{有類型的信息。
根據實現語言的不同,我攽晱i以在這上掄n明 "偽類型", 比如
cstring。 SETOF 袡6表示該函數將返回一套條目, 而不是一條條目。
langname
用以實現函數的語言的名字。 可以是 SQL,C,
internal,或者是使用者定義的過程語言名字。 (又見 createlang。
) 為了保持向下相容,該名字可以用單引號包圍。
IMMUTABLE
STABLE
VOLATILE
這些屬性告訴系統把對該函數的多次調用替換成一次是否安全。 主-
n用於運行時優化。 至少應該聲明一蚇嚝隉C如果任何一-
茬ㄗS有出現,那麼 VOLATILE 是預設假設。
IMMUTABLE 表示該函數在給出同樣的參數匢`是返回相同的結果;
也就是說,它不做數據庫查找或者是使用那些並沒有直接出現在其參數列表裏-
悸澈H息。 如果給出這-
蚇龠窗A那麼任何帶著全部是常量參數對該函數的調用都將立即替換為該函數的-
C
STABLE 表示在一次表掃描裏,對相同參數A 該函數將矇w返回相同的-
A但是它的結果可能在不同 SQL 語句之間變化。 這蚇龠給翵漕痕G-
尪鉏畬w查找,參數變量(比如當前時區),等等的函數是很合適的。
還n注意 current_timestamp 族函數是 stable (矇w)的,因為它怐-
b一次事務中不會變化。
VOLATILE 表示該函數雈i以在一次表掃描內改變,
因此不會做任何優化。很少數據庫函數在這虓妝壑W是易變的;
一些例子是 random(),currval(),
timeofday()。請注意任何有副作用的函數都必需列為易變類,
即使其結果相當有規律也應該這樣,這樣才能避免它被優化;一-
茖狺l就是 setval()。
CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
STRICT CALLED ON NULL INPUT (預設)表明該函數在自己的某些參數是空-
漁尕還是可以按照正常的方式調用。 剩下的事情是函數的作者必須-
t責檢查空H及相應地做出反應。
RETURNS NULL ON NULL INPUT 或 STRICT 表明如果它的任何參數是
NULL,此函數總是返回 NULL。 如果聲明了這荌捊A則如果存在 NULL
參數時不會執行該函數; 而只是自動假設一 NULL 結果。
[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER
SECURITY INVOKER 表明該函數將帶著調用它的使用者的權執行。
這是預設。SECURITY DEFINER 聲明該函數將以創建它的使用者的權-
執行。
關鍵字 EXTERNAL 的目的是和 SQL 相容, 但是我怍M SQL
不同的是,這荅S性不僅僅適用於外部的函數, 所以它是可選的。
definition
一茤w義函數的字串;含義取決於語言。它可以是一茪熙”蝻W字,
一茷向某茈媦釔仵蛌爾纁|,一 SQL 查詢,或者一-
茈庣L程語言寫的文本。
obj_file, link_symbol
這荍峖〞 AS 子句用於在函數的 C 源檔案裏的函數名字和 SQL
函數的名字不同的時唹i動態裝載 C 語言函數。 字串 obj_file
是包含可動態裝載的對象的檔名,而 link_symbol
是函數的鏈接符號,也就是該函數在 C 源檔案裏的名字。
如果省略了鏈接符號,那麼就假設它和被定義的 SQL 函數同名。
attribute
歷史遺留的函數可選信息。下悸瘧搣吤i以在此出現:
isStrict
等效於 STRICT 或者 RETURNS NULL ON NULL INPUT
isCachable
isCachable 是 IMMUTABLE
的過時的等效物;不過出於向下相容,我怳斯M接受它。
屬性名是大小寫無關的。
NOTES`N
請參閱 ``User-Defined Functions'' 獲取更多關於書寫函數的信息。
我怳像\你將完整的 SQL 類型語法用於輸入參數和返回C
不過,有些類型聲明的細節(比如,numeric 類型的精度域)是由下層函數實現-
t責的, 並且會被 CREATE FUNCTION 命令悄悄地吞掉。
(也就是說,不再被識別或強制)。
PostgreSQL 允許函數姜; 也就是說,同一茖蝻W可以用於幾茪ㄕP的函數,
只n它怐滌捊i以區分它怴C不過,所有函數的 C 名字必須不同,
也就是說你必須給予姜的 C 函數不同的 C 名字(比如,使用參數類型作為 C
名字的一部分)。
如果契_調用 CREATE FUNCTION,並且都指向同一茈媦釔仵蛂A
那麼該檔案只裝載一次。-
n卸載和恢復裝載該檔案(可能是在開發過程中),你可以使用 LOAD [load(7)]
命令。
使用 DROP FUNCTION 刪除一茖洏峈怍w義函數。
函數定義裏悸漸籉馧璊瑏鼎峈怳炱袟b都必須用寫雙份的方式逃逸。
n能定義函數,使用者必須對該語言有 USAGE 權。
EXAMPLESl
這裏是一蚋眾瑼漕狺l,用於幫助你開始掌握這茤R令。 更多信息和例子,參閱
``User-Defined Functions''。
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
COMPATIBILITYe性
在 SQL99 裏的確定義了一笏REATE FUNCTION PostgreSQL
的和它類似但是不相容。 這-
蚅搣坌O不可移植的,可以使用的不同語言也是如此。
SEE ALSO見
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>