37.5. Query Language (SQL) Functions
Posted 丹心明月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了37.5. Query Language (SQL) Functions相关的知识,希望对你有一定的参考价值。
37.5 查询语言(SQL)函数
SQL函数执行一组SQL语句列表,并返回里列表中最后一个查询的结果。示例函数:
CREATE FUNCTION clean_emp() RETURNS void AS '
DELETE FROM emp
WHERE salary < 0;
' LANGUAGE SQL;
SELECT clean_emp();
clean_emp
-----------
(1 row)
37.5.1 SQL函数的参数
SQL函数的参数可以在函数体中使用名称或数字引用。使用名称的话,直接定义函数参数名,并在函数体中使用该名称即可(9.2之后才可用)。使用数字引用:$1:引用第一个输入参数。
SQL函数的参数仅可用作数据值,而不可用作定义符。例如:
INSERT INTO mytable VALUES ($1); --可以
INSERT INTO $1 VALUES (42); --不可以
37.5.2 创建于基础类型的SQL函数
可能最简单的函数是没有参数且仅返回基础数据类型:
CREATE FUNCTION one() RETURNS integer AS $$
SELECT 1 AS result;
$$ LANGUAGE SQL;
-- Alternative syntax for string literal:
CREATE FUNCTION one() RETURNS integer AS '
SELECT 1 AS result;
' LANGUAGE SQL;
SELECT one();
one
-----
1
带参数:
CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$
SELECT x + y;
$$ LANGUAGE SQL;
SELECT add_em(1, 2) AS answer;
answer
--------
3
或:
CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$
SELECT $1 + $2;
$$ LANGUAGE SQL;
SELECT add_em(1, 2) AS answer;
answer
--------
3
37.5.3 创建于复合类型的SQL函数
如果函数需要有复合数据类型的参数,那么需要指定返回的数据类型及列。示例:
CREATE FUNCTION new_emp() RETURNS emp AS $$
SELECT text 'None' AS name,
1000.0 AS salary,
25 AS age,
point '(2,2)' AS cubicle;
$$ LANGUAGE SQL;
37.5.4 有输出参数的SQL函数
示例:
CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)
AS 'SELECT x + y'
LANGUAGE SQL;
SELECT add_em(3,7);
add_em
--------
10
(1 row)
使用OUT与RETURN:
CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT
product int)
AS 'SELECT x + y, x * y'
LANGUAGE SQL;
CREATE TYPE sum_prod AS (sum int, product int);
CREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod
AS 'SELECT $1 + $2, $1 * $2'
LANGUAGE SQL;
37.5.5 具有不定参数的SQL函数
SQL函数可使用数组及关键字VARIADIC定义不定个数的参数,但参数类型需要一致。示例:
CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $
$
SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
$$ LANGUAGE SQL;
SELECT mleast(10, -1, 5, 4.4);
mleast
--------
-1
(1 row)
37.5.6 参数具有默认值的SQL函数
使用关键字DEFAULT,示例:
CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)
RETURNS int
LANGUAGE SQL
AS $$
SELECT $1 + $2 + $3;
$$;
SELECT foo(10, 20, 30);
foo
-----
60
(1 row)
SELECT foo(10, 20);
foo
-----
33
(1 row)
SELECT foo(10);
foo
-----
15
(1 row)
37.5.7 将SQL函数用作表
示例:
CREATE TABLE foo (fooid int, foosubid int, fooname text);
INSERT INTO foo VALUES (1, 1, 'Joe');
INSERT INTO foo VALUES (1, 2, 'Ed');
INSERT INTO foo VALUES (2, 1, 'Mary');
CREATE FUNCTION getfoo(int) RETURNS foo AS $$
SELECT * FROM foo WHERE fooid = $1;
$$ LANGUAGE SQL;
SELECT *, upper(fooname) FROM getfoo(1) AS t1;
fooid | foosubid | fooname | upper
-------+----------+---------+-------
1 | 1 | Joe | JOE
(1 row)
37.5.8 返回集合的SQL函数
但SQL函数声明为返回SETOF数据类型,那么函数返回的每行作为结果集的元素返回。示例:
CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$
SELECT * FROM foo WHERE fooid = $1;
$$ LANGUAGE SQL;
SELECT * FROM getfoo(1) AS t1;
结果:
fooid | foosubid | fooname
-------+----------+---------
1 | 1 | Joe
1 | 2 | Ed
(2 rows)
37.5.9 返回TABLE的SQL函数
还有一个方法声明函数返回集合,即使用RETURNS TABLE(columns)语法。示例:
CREATE FUNCTION sum_n_product_with_tab (x int)
RETURNS TABLE(sum int, product int) AS $$
SELECT $1 + tab.y, $1 * tab.y FROM tab;
$$ LANGUAGE SQL;
在此语法中,不允许显式指定IN和OUT参数,所有输出列均需在TABLE后。
37.5.10 多态SQL函数
SQL函数可接收、返回多态数据类型。示例:
CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray
AS $$
SELECT ARRAY[$1, $2];
$$ LANGUAGE SQL;
SELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS
textarray;
intarray | textarray
----------+-----------
1,2 | a,b
(1 row)
37.5.11 指定排序规则的SQL函数
显式指定排序规则示例:
CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS
$$
SELECT min($1[i] COLLATE "en_US") FROM generate_subscripts($1,
1) g(i);
$$ LANGUAGE SQL;
以上是关于37.5. Query Language (SQL) Functions的主要内容,如果未能解决你的问题,请参考以下文章
Doctrine Query Language 获取每组的最大/最新行
DQL(Data Query Language)数据查询语言