📜  PostgreSQL - 返回表的函数

📅  最后修改于: 2022-05-13 01:57:14.722000             🧑  作者: Mango

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

输出: