【问题标题】:Return a table that already exist in postgresql function返回一个已存在于 postgresql 函数中的表
【发布时间】:2022-07-07 23:29:13
【问题描述】:

我有一堆函数返回相同的表模式,所以我必须在这些函数的声明之间一遍又一遍地重复相同的表模式,为了使这个例子简单,假设我们有两个函数返回同一个表架构:

表格:人

CREATE TABLE people(full_name TEXT, age integer);

功能

CREATE OR REPLACE FUNCTION get_people_by_age(_age integer)
RETURNS TABLE(full_name TEXT, age integer)
LANGUAGE PLPGSQL
AS
$$
BEGIN 
    RETURN QUERY SELECT * FROM people  WHERE people.age = $1;
END
$$

CREATE OR REPLACE FUNCTION get_people_by_name(_full_name text)
RETURNS TABLE(full_name TEXT, age integer)
LANGUAGE PLPGSQL
AS
$$
BEGIN 
    RETURN QUERY SELECT * FROM people  WHERE people.full_name = $1;
END
$$

有没有办法在函数声明中引用现有的表?我想像这样:

CREATE OR REPLACE FUNCTION get_people_by_age(_age integer)
RETURNS TABLE(people)
LANGUAGE PLPGSQL
AS
$$
BEGIN 
    RETURN QUERY SELECT * FROM people  WHERE people.age = $1;
END
$$

CREATE OR REPLACE FUNCTION get_people_by_name(_full_name text)
RETURNS TABLE(people)
LANGUAGE PLPGSQL
AS
$$
BEGIN 
    RETURN QUERY SELECT * FROM people  WHERE people.full_name = $1;
END
$$

我不是在每个函数中声明相同的架构,而是引用一个已经存在的表,这可能吗?

【问题讨论】:

    标签: sql database postgresql


    【解决方案1】:

    使用returns setof

    CREATE OR REPLACE FUNCTION get_people_by_name(_full_name text)
    RETURNS setof people
    LANGUAGE PLPGSQL
    AS
    $$
    BEGIN 
        RETURN QUERY SELECT * FROM people  WHERE people.full_name = _full_name;
    END
    $$;
    

    或者像 SQL 函数那样简单一点:

    CREATE OR REPLACE FUNCTION get_people_by_name(_full_name text)
    RETURNS setof people
    LANGUAGE sql
    AS
    $$
      SELECT * FROM people  WHERE people.full_name = _full_name;
    $$;
    

    【讨论】:

      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多