函数中的Postgresql公共表达式表(CTE)

时间:2018-04-17 15:50:48

标签: postgresql stored-procedures syntax-error plpgsql common-table-expression

我试图在PostgreSQL函数中使用CTE并将CTE作为表返回。但我无法按照select ERROR: syntax error at end of input中的CREATE OR REPLACE FUNCTION my_func(name varchar) RETURNS TABLE (hours integer) AS $$ BEGIN WITH a AS ( SELECT hours FROM name_table tbl where tbl.name= name; <- giving error here ) RETURN QUERY SELECT hours FROM a; END; $$ LANGUAGE plpgsql; 来编译函数。有人能指出我在这里失踪的东西。

{{1}}

PS:如果有帮助,我会使用PostgreSQL 9.6。

1 个答案:

答案 0 :(得分:1)

CTE表达式是查询的一部分,因此它需要紧跟在return query子句之后,而不是之前。此外,为了避免以后出现语法错误,您应该选择一个与列名称不明确的参数名称,并完全限定您要查询的列:

CREATE OR REPLACE FUNCTION my_func(v_name varchar)
RETURNS TABLE (hours integer) AS $$
BEGIN
RETURN QUERY WITH a AS (
    SELECT tbl.hours 
    FROM name_table tbl
    WHERE name = v_name
    )
    SELECT a.hours FROM a;
END;
$$ LANGUAGE plpgsql;