2016-08-05 10 views
2

PostgreSQL 9.5Mit IN vs ANY in CREATE FUNCTION

Ich versuche, meinen Kopf herum zu wickeln, wie ich gehen kann, eine Funktion erstellen, die diese aber nicht in der Lage ähnlich arbeiten, um irgendwelche Fortschritte zu machen. Was muss ich optimieren, damit dies richtig funktioniert?

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

Sie können 'RETURN QUERY EXECUTE', anstelle eines einfachen' EXECUTE' (das ist ein noop in Ihrer aktuellen Funktion ist) . – pozs

+0

Vielen Dank für den Hinweis! – Traxus

Antwort

1

Es gibt mehrere Fehler in dem, was Sie getan haben:

  • Sie nicht das erste Argument tbl auf Ihre Funktionsaufruf liefern haben.

  • Sie verwendet current und future als Parameter, aber in der Funktionskörper sind sie arrival_begin und arrival_end genannt (zumindest das ist, was ich nehme an).

  • Sie fügen nicht die Werte von disp, area, current und future auf die Abfrage, aber die Namen der Variablen.

Eine feste Version der Funktion Definition könnte wie folgt aussehen:

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

Vielen Dank für die Reparatur. Das hat wunderbar funktioniert. Ich musste die 'EXECUTE' auf' QUERY EXECUTE RETURN' wechseln. – Traxus