在 PlPGSQL 中以新数据类型返回两个不同的行

Returning two different rows in a new data type in PlPGSQL

我正在尝试编写一个函数,该函数 returns 来自两个不同行的数据,采用新的数据类型。

这是我目前拥有的:

CREATE TABLE foo(
                   dt       DATE NOT NULL,
                   f1       REAL NOT NULL,
                   f2       REAL NOT NULL,
                   f3       REAL NOT NULL,
                   f4       REAL NOT NULL,
                );




CREATE TYPE start_finish_type AS (start_f1 REAL, start_f2 REAL, start_f3 REAL, start_f4 REAL,
                                finish_f1 REAL, finish_f2 REAL, finish_f3 REAL, finish_f4 REAL);


CREATE FUNCTION fetch_begin_end_data(start_date DATE, finish_date DATE)
RETURNS start_finish_type AS $$
DECLARE
actual_start_date  DATE;
actual_finish_date DATE ;
retval             start_finish_type;
BEGIN
    -- Select earliest row matching start_date
    SELECT MIN(dt) INTO actual_start_date  FROM foo WHERE dt >= start_date;
    SELECT MIN(dt) INTO actual_finish_date FROM foo WHERE dt <= finish_date;

    SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_start_date;
    SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_finish_date;

    -- How do I store the values obtained above and return them in the new type?

END
$$ LANGUAGE plpgsql;

我的问题是:如何修改函数,使其 returns 来自两个不同行的数据,并 returns 它们采用新的数据类型?

尝试:

CREATE or replace FUNCTION fetchbeginenddata(start_date DATE, end_date DATE)
RETURNS startfinishtype AS $$
DECLARE
actual_start_date  DATE;
actual_finish_date DATE ;
retval             startfinishtype;
BEGIN
    -- Select earliest row matching start_date
    SELECT MIN(dt) INTO actual_start_date  FROM foo WHERE dt >= start_date;
    SELECT MIN(dt) INTO actual_finish_date FROM foo WHERE dt <= finish_date;

    SELECT (a.f1,a.f2, a.f3, a.f4,b.f1,b.f2, b.f3, b.f4)
    FROM
      (SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_start_date) a
    JOIN
      (SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_finish_date) b
    ON true into retval;
   return retval;


END
$$ LANGUAGE plpgsql;

当然需要这两个都选择 return 一行

更新 正如@eurotrash 所述,您可能希望显式命名复合类型属性以匹配顺序,例如:

INTO retval.start_f1, retval.start_f2, ...

不只是

INTO retval;