我是 PostgreSQL 的新手,在让它做我想做的事情时遇到了一些问题。
我需要构建一个可以接受多个变量的函数,在内部执行多个查询,然后返回一个由几行和几列组成的数据集。我已经构建了几个测试函数来更好地掌握 Postgres 的功能,这里是一个:
CREATE OR REPLACE FUNCTION sql_with_rows11(id integer) RETURNS character varying AS $BODY$
declare vid integer;
declare vendor character varying;
BEGIN
vid := (select v_id from public.gc_alerts where a_id = id);
vendor := (select v_name from public.gc_vendors where v_id = vid);
RETURN vendor;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION sql_with_rows11(integer)
OWNER TO postgres;
我知道我可以将其组合成一个查询,但这更像是一种练习。这工作正常,我得到了供应商名称。但是,现在我需要从表中返回不止一列gc_vendors
。
最后,我将需要构建一个函数,该函数将根据子查询从多个表中返回列。我已经研究过创建一个结果集函数,但我相信它一次只返回一行。我还研究了返回 setof 类型,但这似乎仅限于存在的表。
- - - - - - - 编辑
嘿伙计们,谢谢你的帮助。我将功能更改为以下内容:
CREATE OR REPLACE FUNCTION sql_with_rows14(IN v_uid character varying, IN lid integer)
RETURNS table (aid int, aname character varying) AS $BODY$
declare aid integer;
declare aname character varying;
BEGIN
sql_with_rows14.aid := (select a_id from public.gc_alerts where v_id = sql_with_rows14.v_uid);
sql_with_rows14.aname := (select a_name from public.gc_alerts where a_id = sql_with_rows14.aid);
RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
我也尝试使用 RETURN NEXT,但结果相同。
当我查询它时,如果查询只返回一行,它工作正常。但是它不适用于多行。我也尝试过类似的方法,结果相同。大家能再帮忙吗?
也试过这个: BEGIN sql_with_rows14.aid := (select a_id from public.gc_alerts); sql_with_rows14.aname := (从 public.gc_alerts 中选择 a_name);
RETURN NEXT;
END;