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 數據類型之外。
根據實現語言的不同,我們還可以在這上面聲明
"僞類型", 比如
cstring。 SETOF
修飾詞表示該函數將返回一套條目,
而不是一條條目。
IMMUTABLE 表示該函數在給出同樣的參數值時總是返回相同的結果; 也就是說,它不做數據庫查找或者是使用那些並沒有直接出現在其參數列表裏面的信息。 如果給出這個選項,那麼任何帶着全部是常量參數對該函數的調用都將立即替換爲該函數的值。
STABLE 表示在一次表掃描裏,對相同參數值, 該函數將穩定返回相同的值,但是它的結果可能在不同 SQL 語句之間變化。 這個選項對那些結果倚賴數據庫查找,參數變量(比如當前時區),等等的函數是很合適的。 還要注意 current_timestamp 族函數是 stable (穩定)的,因爲它們的值在一次事務中不會變化。
VOLATILE 表示該函數值甚至可以在一次表掃描內改變, 因此不會做任何優化。很少數據庫函數在這個概念上是易變的; 一些例子是 random(),currval(), timeofday()。請注意任何有副作用的函數都必需列爲易變類, 即使其結果相當有規律也應該這樣,這樣才能避免它被優化;一個例子就是 setval()。
RETURNS NULL ON NULL INPUT 或 STRICT 表明如果它的任何參數是 NULL,此函數總是返回 NULL。 如果聲明瞭這個參數,則如果存在 NULL 參數時不會執行該函數; 而只是自動假設一個 NULL 結果。
關鍵字 EXTERNAL
的目的是和 SQL 兼容,
但是我們和 SQL
不同的是,這個特性不僅僅適用於外部的函數,
所以它是可選的。
屬性名是大小寫無關的。
請參閱 ``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 |