postgresql函数-执行“创建表…”-意外结果

postgresql函数-执行“创建表…”-意外结果,postgresql,user-defined-functions,plpgsql,execute,dynamic-sql,Postgresql,User Defined Functions,Plpgsql,Execute,Dynamic Sql,我正在编写一个函数,它执行以下操作: 使用单个字段创建临时表。 此字段是特定表中最多5个变量之和的结果 假设我有下表: create table src (x1 numeric, x2 numeric); insert into src values (2,1),(5,2),(10,4); 我的代码是: create or replace function qwert(cod numeric, v1 numeric default 0 , v2 numeric default 0, v

我正在编写一个函数,它执行以下操作:

使用单个字段创建临时表。 此字段是特定表中最多5个变量之和的结果

假设我有下表:

create table src (x1 numeric, x2 numeric);
insert into src values (2,1),(5,2),(10,4);
我的代码是:

create or replace function qwert(cod numeric, v1 numeric default 0
    , v2 numeric default 0, v3 numeric default 0, v4 numeric default 0,
    v5 numeric default 0)
returns numeric as
$func$
declare vv numeric;
begin
vv = v1+v2+v3+v4+v5;
execute '
    drop table if exists t' || cod || '; 
    create temporary table t' || cod || ' as 
    select ' || vv || ' ;'
    ;
return vv;
end
$func$ language plpgsql;
如果我跑步: 从src中选择qwert1、x1、x2

预期结果为表t1:

 column1 
---------
       3
       7
       14
(3 rows)
结果是:

db1=# select * from t1;
 ?column? 
----------
       14
(1 row)
在我的代码中,第行: 返回vv; 仅用于检查vv是否正确创建

有人能帮你吗?

的工作原理如下:

CREATE OR REPLACE FUNCTION qwert(_tbl text, cols text[])
  RETURNS numeric AS
$func$
BEGIN

EXECUTE format('
     DROP TABLE IF EXISTS %1$I;
     CREATE TEMPORARY TABLE %1$I AS 
     SELECT %2$s AS col_sum FROM src;'
   ,_tbl
   ,(SELECT string_agg(quote_ident(i), ' + ') FROM unnest(cols) i)
    );

RETURN 1;  -- still unclear? Add yourself ...
END
$func$ LANGUAGE PLPGSQL;
电话:

或:

格式要求Postgres 9.1或更高版本

我使用一个文本参数作为临时表名,使用一个文本数组作为列名,然后使用、和的组合构建表达式。别忘了在我的ex.中命名colu_sum列


有关的详细信息。这样可以传递任意数量的列。

对不起。我编辑了这个问题。希望现在清楚了。你需要临时表做什么?或者这只是从函数中获取一组行的失败尝试?而且,你的问题仍然不正确。是否要从表src求x1+x2之和?我需要一个临时表来存储新变量,以便在进一步计算中使用。在每个会话中,我的输入变量可能会改变。我想将五列相加,因此我将默认值设置为零。作为一个例子,我只是尝试对src中的两列x1和x2求和。结果表应具有x1+x2 3,7,14。非常抱歉。我的查询应该是:从src中选择qwert1、x1、x2;因此产生了混乱,我想…我运行了你的代码,结果是一个值为10,4,0,0,0的表。我想我的问题不清楚。我刚才编辑过。谢谢。我的表必须是select查询的结果。我正在使用的真正的表有数千条记录。谢谢。如能考虑,我将不胜感激。
SELECT qwert('t1', ARRAY['x1','x2']);
SELECT qwert('t1', '{x1,x2}');