在CREATE FUNCTION中使用IN与ANY

时间:2016-08-05 07:19:47

标签: postgresql

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;

1 个答案:

答案 0 :(得分: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;