Squ*_*all 2 sql postgresql function plpgsql
我正在使用PostgreSQL 8.4,我想创建一个返回多行查询的函数.
下面的函数不能正常工作:
create function get_names(varchar) returns setof record AS $$
declare
tname alias for $1;
res setof record;
begin
select * into res from mytable where name = tname;
return res;
end;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
该类型record仅允许单行.
如何返回整个查询?我想使用函数作为查询模板.
CREATE OR REPLACE FUNCTION get_names(_tname varchar)
RETURNS TABLE (col_a integer, col_b text) AS
$func$
BEGIN
RETURN QUERY
SELECT t.col_a, t.col_b -- must match RETURNS TABLE
FROM mytable t
WHERE t.name = _tname;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
像这样打电话:
SELECT * FROM get_names('name')
Run Code Online (Sandbox Code Playgroud)
主要观点:
使用RETURNS TABLE,因此您不必为每次调用提供列名列表.
使用RETURN QUERY,更简单.
表限定列名以避免命名与具有相同名称的OUT参数(包括声明的列RETURNS TABLE)的冲突.
使用命名变量而不是ALIAS.更简单,做同样的事情,这是首选方式.
像这样的简单函数也可以写成LANGUAGE sql:
CREATE OR REPLACE FUNCTION get_names(_tname varchar)
RETURNS TABLE (col_a integer, col_b text) AS
$func$
SELECT t.col_a, t.col_b --, more columns - must match RETURNS above
FROM mytable t
WHERE t.name = $1;
$func$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)