我写了一个SP,使用PL / pgsql。
我想返回一个记录,包括来自几个不同的表的字段。可能看起来像这样:
我想返回一个记录,包括来自几个不同的表的字段。可能看起来像这样:
CREATE OR REPLACE FUNCTION get_object_fields(name text) RETURNS RECORD AS $$ BEGIN -- fetch fields f1,f2 and f3 from table t1 -- fetch fields f4,f5 from table t2 -- fetch fields f6,f7 and f8 from table t3 -- return fields f1 ... f8 as a record END $$ language plpgsql;
如何从单个记录中的字段返回不同表中的字段?
[编辑]
我意识到,上面给出的例子太简单了。我需要检索的一些字段将被保存为正在查询的数据库表中的单独行,但是我想在“flattened”记录结构中返回它们。
下面的代码应该进一步说明:
CREATE TABLE user (id int,school_id int,name varchar(32)); CREATE TYPE my_type ( user1_id int,user1_name varchar(32),user2_id int,user2_name varchar(32) ); CREATE OR REPLACE FUNCTION get_two_users_from_school(schoolid int) RETURNS my_type AS $$ DECLARE result my_type; temp_result user; BEGIN -- for purpose of this question assume 2 rows returned SELECT id,name INTO temp_result FROM user where school_id = schoolid LIMIT 2; -- Will the (pseudo)code below work?: result.user1_id := temp_result[0].id ; result.user1_name := temp_result[0].name ; result.user2_id := temp_result[1].id ; result.user2_name := temp_result[1].name ; return result ; END $$ language plpgsql
您需要定义一个新类型并定义您的函数以返回该类型。
原文链接:https://www.f2er.com/postgresql/193635.htmlCREATE TYPE my_type AS (f1 varchar(10),f2 varchar(10) /*,... */ ); CREATE OR REPLACE FUNCTION get_object_fields(name text) RETURNS my_type AS $$ DECLARE result_record my_type; BEGIN SELECT f1,f2,f3 INTO result_record.f1,result_record.f2,result_record.f3 FROM table1 WHERE pk_col = 42; SELECT f3 INTO result_record.f3 FROM table2 WHERE pk_col = 24; RETURN result_record; END $$ LANGUAGE plpgsql;
如果要返回多个记录,您需要将该函数定义为返回setof my_type
更新
另一个选项是使用RETURNS TABLE(),而不是创建在Postgres 8.4中引入的TYPE
CREATE OR REPLACE FUNCTION get_object_fields(name text) RETURNS TABLE (f1 varchar(10),... */ ) ...