Greenplum中的自定義函數

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作爲返回類型。只有OUTINOUT參數時,RETURNS語句可以被省略。

SETOF修飾符表明函數會返回一個item集合, 而不是一個item。

Langname

函數使用的語言名稱,可以爲SQLC或者用戶自定義的語言

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';

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章