在PostgreSQL中返回一个复合类型

时间:2014-03-12 04:04:13

标签: postgresql stored-procedures pattern-matching plpgsql

我从输入字符串中提取起始值和结束值,并将它们存储在我需要返回的局部变量中

CREATE OR REPLACE FUNCTION test.getweeks_data(paramweek character varying)
  RETURNS SETOF test.weekly_data_type AS
$BODY$
DECLARE
     v_start_date date;
     v_end_date date;
     r test.weekly_data_type%rowtype;

BEGIN

    v_start_date := to_date(substring( paramweek, '^...........'), 'DD Mon YYYY');
    v_end_date := to_date(substring( paramweek, '...........$'),'DD Mon YYYY'); 

END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

我的类型定义为

CREATE TYPE test.weekly_data_type AS
   (week_start_date date,
    week_end_date date
    );

请建议一种合适的方式来退回v_start_datev_end_date

2 个答案:

答案 0 :(得分:1)

r.week_start_date := v_start_date;
r.week_end_data := v_end_date;
RETURN NEXT r;

答案 1 :(得分:1)

您的功能可以(并且应该)在多个地方进行改进:

CREATE OR REPLACE FUNCTION getweeks_data(paramweek text
                                       , OUT week_start_date date
                                       , OUT week_end_date date) AS
$func$
SELECT to_date(left (paramweek, 11), 'DD Mon YYYY')
     , to_date(right(paramweek, 11), 'DD Mon YYYY')
$func$  LANGUAGE sql IMMUTABLE
  • 不要使用SETOF,只返回一行。 您可能使用您的自定义复合类型,但我建议使用OUT parameters进行简化,如图所示。

  • 制作功能IMMUTABLE,而不是VOLATILE。重复呼叫的性能更佳。

  • 根本不需要plpgsql。一个简单的SQL函数完成这项工作。可以在大查询中“内联”,为重复调用提供更好的性能。

  • 使用left()right()代替正则表达式。更简单,更短,更快。