Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 返回类型设置为table加上其他字段的简单方法?_Postgresql_Plpgsql_Postgresql 9.2_Composite Types - Fatal编程技术网

Postgresql 返回类型设置为table加上其他字段的简单方法?

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,以便它在每个返回记录的“末尾”返回另外两个字段。我可以做一些事情,比如:

我正在编写一个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_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
。。。将对返回类型中的每一列计算一次。详情: