Postgresql 返回类型设置为table加上其他字段的简单方法?
我正在编写一个PL/pgSQL存储过程,它将返回一组记录;每个记录都包含现有表的所有字段(称为Retailer,它有两个字段:Retailer\u key和Retailer\u name)。当然,这是可行的:Postgresql 返回类型设置为table加上其他字段的简单方法?,postgresql,plpgsql,postgresql-9.2,composite-types,Postgresql,Plpgsql,Postgresql 9.2,Composite Types,我正在编写一个PL/pgSQL存储过程,它将返回一组记录;每个记录都包含现有表的所有字段(称为Retailer,它有两个字段:Retailer\u key和Retailer\u name)。当然,这是可行的: CREATE FUNCTION proc_Find_retailers (IN p_Store_key INT) RETURNS SETOF Retailer AS $$ ...` 现在,我想更新sp,以便它在每个返回记录的“末尾”返回另外两个字段。我可以做一些事情,比如:
CREATE FUNCTION proc_Find_retailers
(IN p_Store_key INT)
RETURNS SETOF Retailer
AS $$ ...`
现在,我想更新sp,以便它在每个返回记录的“末尾”返回另外两个字段。我可以做一些事情,比如:
CREATE FUNCTION proc_Find_store
(IN p_Store_key INT)
RETURNS TABLE (
retailer_key int,
retailer_name varchar(50),
addl_field_1 int,
addl_field_2 double precision)
AS $$ ...
在现实世界中,我的Retailer表有50个字段(而不是我示例中的两个),因此在RETURNS table子句中枚举所有这些字段非常繁琐。有没有什么捷径,我可以说这样的话(我意识到我在这里编造的东西在语法上是非法的,但我这么做是为了给你我想要的东西的味道):
您可以将整行作为复合类型返回,并添加更多内容:
CREATE OR REPLACE FUNCTION f_rowplus()
RETURNS TABLE (rec demo, add_int int, add_txt text) AS
$func$
SELECT d, 5, 'baz'::text FROM demo d;
$func$ LANGUAGE sql;
但是,当您使用简单调用时:
SELECT * FROM f_rowplus();
您可以从表demo
中将行作为单独的复合类型获取。你必须打电话:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
获取所有单独的列。需要括号
Postgres在这里有点不一致。如果创建具有以下内容的函数:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
然后复合类型demo
被静默地转换为单独的列(分解)。没有保留到原始复合类型的链接。您根本无法引用声明的输出列rec
,因为该列已替换为分解类型的列。此调用将导致错误消息:
SELECT rec FROM f_row2();
但是,一旦您添加了更多的列
,组合类型将保留为声明的(未分解),您可以:
SELECT rec FROM f_rowplus();
使用第一个函数
我创建了一个演示变体的示例
旁白
当使用一个函数在<代码>列表中返回多个列(作为表函数)并在<代码>列表中分解时,如下所示选择<代码>列表:
SELECT (rec).* FROM f_rowplus();
SELECT (f_rowplus()).*; -- also: different result
。。。该函数仍然只计算一次-调用和分解时,直接在SELECT
列表中进行,如下所示:
SELECT (rec).* FROM f_rowplus();
SELECT (f_rowplus()).*; -- also: different result
。。。将对返回类型中的每一列计算一次。详情: