函数中的 Postgresql 通用表达式 Table (CTE)

Postgresql Common Expression Table (CTE) in Function

我正在尝试在 PostgreSQL 函数中使用 CTE 并将 CTE 作为 table 返回。但是我无法按照 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;

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

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

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;