2016-08-05 92 views
2

的PostgreSQL 9.5使用VS任何CREATE FUNCTION

我试图环绕我怎么能去创建,将工作与此类似,但未能取得任何进展的功能我的头。我需要做些什么才能适当地完成这项工作。

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

你可能想'返回查询EXECUTE',而不是简单的'EXECUTE'(这是在当前的功能一个空操作) 。 – pozs

+0

谢谢你的提示! – Traxus

回答

1

有你做了什么,几个错误:

  • 你没有提供的第一个参数tbl你的函数调用。

  • 您使用currentfuture作为参数,但在函数体中,他们被称为arrival_beginarrival_end(至少这是我承担)。

  • 你没的dispareacurrentfuture值添加到查询,但名称的变量的

函数定义的一个固定的版本可能是这样的:

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; 
+0

感谢您解决它。这工作很好。我必须将'EXECUTE'更改为'RETURN QUERY EXECUTE'。 – Traxus