我从输入字符串中提取起始值和结束值,并将它们存储在我需要返回的局部变量中
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_date
和v_end_date
。
答案 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()
代替正则表达式。更简单,更短,更快。