PostgreSQL - 返回表的函数
在本文中,我们将研究开发返回表的函数的过程。我们将使用示例数据库中的film表进行演示:
以下函数使用ILIKE运算符返回标题与特定模式匹配的所有电影:
CREATE OR REPLACE FUNCTION get_film (p_pattern VARCHAR)
RETURNS TABLE (
film_title VARCHAR,
film_release_year INT
)
AS $$
BEGIN
RETURN QUERY SELECT
title,
cast( release_year as integer)
FROM
film
WHERE
title ILIKE p_pattern ;
END; $$
LANGUAGE 'plpgsql';
这个get_film(varchar)函数接受一个参数p_pattern ,它是一种您想要与电影标题匹配的模式。
要从函数返回表,请使用 RETURNS TABLE 语法并指定表的列。每列由逗号 (, ) 分隔。
在函数,我们返回一个查询,该查询是 SELECT 语句的结果。请注意,SELECT 语句中的列必须与我们要返回的表的列匹配。因为film表的release_year的数据类型不是整数,所以我们必须使用CAST将其转换为整数。
我们可以使用以下语句测试该函数:
SELECT
*
FROM
get_film ('Al%');
我们称 get_film(varchar)函数获取标题以Al开头的所有电影。结果如下:
请注意,如果您使用以下语句调用该函数:
SELECT
get_film ('Al%');
PostgreSQL 返回一个表,其中一列包含电影数组。
在实践中,您通常会先处理每一行,然后再将其附加到函数的结果集中。下面的例子说明了这个想法。
CREATE OR REPLACE FUNCTION get_film (p_pattern VARCHAR, p_year INT)
RETURNS TABLE (
film_title VARCHAR,
film_release_year INT
) AS $$
DECLARE
var_r record;
BEGIN
FOR var_r IN(SELECT
title,
release_year
FROM film
WHERE title ILIKE p_pattern AND
release_year = p_year)
LOOP
film_title := upper(var_r.title) ;
film_release_year := var_r.release_year;
RETURN NEXT;
END LOOP;
END; $$
LANGUAGE 'plpgsql';
我们创建了一个具有相似名称的函数 get_film(varchar, int)但接受两个参数:
- 第一个参数是 如果标题与此模式匹配,我们用来搜索电影的p_pattern 。
- 第二个参数是电影的发行年份。
RETURN NEXT 语句向函数的结果集中添加一行。执行继续,结果集在循环的每次迭代中建立。
请参阅以下测试用例:
SELECT
*
FROM
get_film ('%er', 2006);
输出: