CREATE FUNCTION
定義一個函數.
語法
CREATE [OR REPLACE] FUNCTION name
( [ [argmode] [argname] argtype [ { DEFAULT | = } defexpr ] [, ...] ] )
[ RETURNS { [ SETOF ] rettype
| TABLE ([{ argname argtype | LIKE other table }
[, ...]])
} ]
{ LANGUAGE langname
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINE
| COST execution_cost
| SET configuration_parameter { TO value | = value | FROM CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol' } ...
[ WITH ({ DESCRIBE = describe_function
} [, ...] ) ]
描述
CREATE FUNCTION定義一個新的函數. CREATE OR REPLACE FUNCTION 要麼創建一個新的函數,要麼取代一個已經存在的函數。
新函數的名字不能與一個已經存在的並且具有相同參數的函數重名,不同參數的函數可以同名(重載)。
要更新一個已經在的函數的定義,需要使用CREATE OR REPLACE FUNCTION。使用這種方式不能改變一個函數的參數和函數名(因爲這樣相當於是在創建一個新的函數)。CREATE OR REPLACE FUNCTION不允許改變已經存在的函數的返回值類型,如果要這樣做,那麼需要將原函數刪除,然後重新創建新的函數。如果刪除函數去創建一個新的函數,必須先刪除已經存在的依賴該函數的對象(rules, views, triggers等等)。使用CREATE OR REPLACE FUNCTION去改變函數的定義,不會改變其他的對象對於該函數的依賴。
使用VOLATILE和 STABLE 函數的限制
爲了避免Greenplum中跨segemnt的數據不同步問題,任何被歸爲STABLE 和VOLATILE類型的函數不能再segment上執行,比如,函數random() 或者 timeofday()不能在greenplum中的分佈式數據上執行,因爲會導致segment實例之間的數據不一致。
爲了保持數據的一致性,STABLE 和VOLATILE函數只有在master上執行時纔可以被使用,比如下面的語句只會在master上執行(沒有from語句)。
SELECT setval('myseq', 201);
SELECT foo();
參數
name
函數的名字.
argmode
參數的模型: 可以選擇的值爲 IN, OUT, INOUT和 VARIADIC. 只有 OUT 參數可以跟一個聲明爲VARIADIC的參數. 如果省略,默認值爲IN.
argname
參數的名字. 一些語言 (目前只有 PL/pgSQL) 允許你函數體內使用的名稱。
For other languages the name of an input argument is just
extra documentation. 輸出參數的名字是非常重要的,以爲它決定了輸出結果row的列名。
(如果省略了輸出參數名字,系統會選擇默認的列名)
argtype
函數參數的數據類型
defexpr
如果未指定參數,將用作默認值的表達式。這個表達式必須對參數的參數類型強制。只有IN和INOUT參數可以具有默認值。
rettype
返回的數據類型. 如果該函數不支持返回一個值,則使用void作爲返回類型。只有OUT和INOUT參數時,RETURNS語句可以被省略。
SETOF修飾符表明函數會返回一個item集合, 而不是一個item。
Langname
函數使用的語言名稱,可以爲SQL,C或者用戶自定義的語言
IMMUTABLE
STABLE
VOLATILE
該屬性會告訴查詢優化器關於函數的行爲,如果省略, VOLATILE 爲默認值.
IMMUTABLE說明函數不能夠修改數據庫,並且對於給定相同的參數值的情況總是返回相同的結果。
STABLE 說明函數不能修改數據庫
VOLATILE 說明函數可以修改事件(event), 所以沒有做任何優化。
CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
STRICT
CALLED ON NULL INPUT (默認值)說明當一些參數爲null時該函數會被調用。
RETURNS NULL ON NULL INPUT和 STRICT 說明函數總是返回null,
[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER
SECURITY INVOKER (默認值) 說明具有調用該函數權限的用戶纔可以去執行。
.SECURITY DEFINER 說明該函數可以以創建它的用戶的權限去執行。
COST execution_cost
一個正數,說明函數執行的消耗。如果沒有指定,對於c語言和內置函數而言,默認值爲1
, 如果使用的是其他的語言,默認值爲100 。
configuration_parameter
value
進入函數時應用到session配置的值
definition
定義函數的字符串常亮;意味着所依賴的語言,可以是內部函數的名稱,對象文件的路徑,一個SQL命令,或者是過程化語言的文本文件等。
Examples
一個簡單的加法函數:
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
增加一個整形數的值,使用參數的名字, 使用 PL/pgSQL:
CREATE OR REPLACE FUNCTION increment(i integer) RETURNS
integer AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;
對於一個PL/pgSQL函數,增加每次查詢時的segment主機內存:
CREATE OR REPLACE FUNCTION function_with_query() RETURNS
SETOF text AS $$
BEGIN
RETURN QUERY
EXPLAIN ANALYZE SELECT * FROM large_table;
END;
$$ LANGUAGE plpgsql
SET statement_mem='256MB';