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 |