PostgreSQL 9.5
我试图围绕如何创建一个类似于此功能但无法取得任何进展的功能。我需要调整什么才能使其正常工作。
SELECT * FROM get_all_rows ('{Home,Away}','{LF,RL,CENTER}','2016-06-01 00:00:00','2016-06-30 23:59:59')
-- '2016-06-08 12:24:50','2016-06-09 04:59:45','SW'
-- '2016-06-08 07:12:12','2016-06-09 08:55:25','NW'
CREATE OR REPLACE FUNCTION get_all_rows (
tbl TEXT,
disp TEXT[],
area TEXT[],
current TIMESTAMP,
future TIMESTAMP
)
RETURNS TABLE (
a TIMESTAMP,
b TIMESTAMP,
c TEXT
) AS
$func$
BEGIN
EXECUTE
'SELECT
door_time,
guard_time,
area
FROM
' || quote_ident(tbl) || '
WHERE
disposition = ANY (disp)
and area = ANY (area)
and door_time IS NOT NULL
and guard_time IS NOT NULL
and arrival >= arrival_begin
and arrival <= arrival_end';
END
$func$ LANGUAGE plpgsql;
答案 0 :(得分:1)
你做了几件事:
您没有为函数调用提供第一个参数tbl
。
您使用current
和future
作为参数,但在函数体中,它们被称为arrival_begin
和arrival_end
(至少这是我所假设的)。
disp
,area
,current
和future
的值添加到查询中,但名称的变量。函数定义的固定版本可能如下所示:
CREATE OR REPLACE FUNCTION get_all_rows (
tbl TEXT,
disp TEXT,
area TEXT,
current TIMESTAMP,
future TIMESTAMP
)
RETURNS TABLE (
a TIMESTAMP,
b TIMESTAMP,
c TEXT) AS
$func$
BEGIN
RETURN QUERY EXECUTE
'SELECT
door_time,
guard_time,
area
FROM
' || quote_ident(tbl) || '
WHERE
disposition = ANY (' || quote_literal(disp) || ')
and area = ANY (' || quote_literal(area) || ')
and door_time IS NOT NULL
and guard_time IS NOT NULL
and arrival >= ' || quote_literal(current) || '
and arrival <= ' || quote_literal(future);
END
$func$ LANGUAGE plpgsql;