【问题标题】:How to create a procedure that returns a set of rows from a table in postgreSQL如何创建一个从 postgreSQL 中的表返回一组行的过程
【发布时间】:2019-12-26 09:24:55
【问题描述】:

如何创建一个从表中返回一组行的过程? 或者甚至可以返回带有过程的表格结果集。 我尝试像在函数和 table(id int) 中一样添加 returns setof students,但它不起作用。

示例代码:

CREATE OR REPLACE PROCEDURE getStudents()
LANGUAGE plpgsql
AS $$
BEGIN
 SELECT * FROM STUDENTS
COMMIT;
RETURN;
END;
$$;

我可以调用它,但它说查询没有结果数据的目的地

【问题讨论】:

标签: sql postgresql stored-procedures


【解决方案1】:

过程并不意味着返回数据,这就是函数的用途。

您可以为此使用纯 SQL 函数,无需 PL/pgSQL:

CREATE OR REPLACE funct get_students()
   returns setof student
   LANGUAGE sqö
AS $$
  select *
  from students;
$$;

然后像表格一样使用它:

select *
from get_students();

也不需要提交。

【讨论】:

    【解决方案2】:

    尝试使用函数而不是过程。我经常用这个。

    您需要创建一个 ctype 来获取数据。 放置您必须从 STUDENTS 表中获取的所有列。 语法如下:

    CREATE TYPE students_data_ctype AS
    (
    column_1 int4,
    column_2 varchar(100),
    column_3 varchar(500)
    )
    

    然后创建一个函数:

    CREATE
        OR
    REPLACE
        FUNCTION PUBLIC.getStudents 
        ()
        RETURNS SETOF students_data_ctype AS $BODY$ DECLARE res 
        students_data_ctype; 
    BEGIN
        FOR res IN 
    SELECT
        column_1,
        column_2,
        column_3
    FROM
        STUDENTS 
    LOOP RETURN NEXT res; 
        END LOOP; 
    END
        ; $BODY$ LANGUAGE 'plpgsql'
    GO
    

    函数调用:

    Select * FROM getStudents()
    

    塔达啊!你会得到你的数据。

    【讨论】:

    • 不需要创建类型来创建集合返回函数,可以将函数声明为returns table (...)。语言名称是一个标识符,不应被引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2022-10-19
    • 2011-09-02
    • 2012-09-26
    相关资源
    最近更新 更多