什么是SQL函數?
- SQL函數包體是一些可執行的SQL語言。同時包含1條以上的查詢,但是函數只返回最后一個查詢(必須是SELECT)的結果。
- 除非SQL函數聲明為返回void,否則最后一條語句必須是SELECT
- 在簡單情況下,返回最后一條查詢結果的第一行。
- 如果最后一個查詢不返回任何行,那么該函數將返回NULL值。
- 如果需要該函數返回最后一條SELECT語句的所有行,可以將函數的返回值定義為集合,即SETOF sometype。
模板
CREATE OR REPLACE FUNCTION function_name([ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ]) [RETURNS rettype] AS $$ $BODY$; $$ LANGUAGE SQL;
案例講解
案例1:編寫一個add函數;返回值為參數1+參數2.
CREATE OR REPLACE FUNCTION add(a NUMERIC, b NUMERIC) RETURNS NUMERIC AS $$ SELECT a+b; $$ LANGUAGE SQL;
調用方法
lottu=# select add(2,3); add ----- 5 (1 row) lottu=# select * from add(2,3); add ----- 5 (1 row)
知識點:
聲明函數參數;以add函數來演示如果只指定輸入參數類型,不指定參數名,則函數體里一般用$1,$n這樣的標識符來使用參數。
CREATE OR REPLACE FUNCTION add3(NUMERIC,NUMERIC) RETURNS NUMERIC AS $$ SELECT $1 + $2; $$ LANGUAGE SQL;
但該方法可讀性不好,建議還是采用前面一種的方法。
案例2:編寫一個add1函數;返回值為參數1+參數2.
上面這種方式參數列表只包含函數輸入參數,不包含輸出參數。下面這個例子將同時包含輸入參數和輸出參數;由於存在輸出參數;這里不需要returns部分
CREATE OR REPLACE FUNCTION add1(in a NUMERIC, in b NUMERIC,out c numeric) AS $$ SELECT a+b; $$ LANGUAGE SQL;
調用方法
lottu=# select add1(7,4); add1 ------ 11
案例3:編寫一個plus_and_minus函數;返回值為參數1+參數2,參數1-參數2.
在函數定義中,可以寫多個SQL語句,不一定是SELECT語句,可以是其它任意合法的SQL。但最后一條SQL必須是SELECT語句並且該SQL的結果將作為該函數的輸出結果。
CREATE OR REPLACE FUNCTION plus_and_minus(IN a INTEGER, IN b NUMERIC, OUT c NUMERIC, OUT d NUMERIC) AS $$ SELECT a+b, a-b; delete from t where id > 9999; SELECT a-b, a+b; $$ LANGUAGE SQL;
調用方法
lottu=# select * from plus_and_minus(7,5); c | d ---+---- 2 | 12
案例4: 編寫一個不需要返回結果的delete_t函數
上面例子都有返回結果;且最后一條SQL必須是SELECT語句。假如需求不需要返回結果;請看下例。
CREATE OR REPLACE FUNCTION delete_t() RETURNS void AS $$ delete from t where id > 999; $$ LANGUAGE SQL;
調用方法
lottu=# select delete_t(); delete_t ----------
案例5:若表EMP存在多條記錄;結果會是?
返回最后一條查詢結果的第一行
CREATE OR REPLACE FUNCTION select_emp_1() RETURNS numeric AS $$ select empno from emp; $$ LANGUAGE SQL;
調用方法
lottu=# select select_emp_1(); select_emp_1 -------------- 7369
案例6:返回表emp所有記錄。
若需要該函數返回最后一條SELECT語句的所有行,可以將函數的返回值定義為集合,即SETOF sometype。
CREATE OR REPLACE FUNCTION select_emp_2() RETURNS setof numeric AS $$ select empno from emp; $$ LANGUAGE SQL;
調用方法
lottu=# select select_emp_2(); select_emp_2 -------------- 7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934
