2016-08-05 89 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