【问题标题】:postgresql functions - execute 'create table...' - unexpected resultspostgresql 函数 - 执行“创建表...” - 意外结果
【发布时间】:2013-10-22 02:12:24
【问题描述】:

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

创建一个包含单个字段的临时表。 该字段是特定表中最多 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 中选择 qwert(1, x1,x2);

预期结果是一个表t1:

 column1 
---------
       3
       7
       14
(3 rows)

结果却是:

db1=# select * from t1;
 ?column? 
----------
       14
(1 row)

在我的代码中,行: 返回 vv; 只是用来检查 vv 是否被正确创建。

有人可以帮助你吗?

【问题讨论】:

  • 对不起。我编辑了这个问题。希望现在清楚了。
  • 你需要临时表做什么?或者这只是从函数中获取一组行的(失败的)尝试?另外,您的问题仍然没有加起来。您想从表src 中求和x1 + x2 吗?
  • 我需要一个临时表来存储我需要在进一步计算中使用的新变量。在每个会话中,我的输入变量可能会发生变化。我想总结五列,因此我将默认值设置为零。例如,我只是想对两列求和(来自 src 的 x1 和 x2)。结果表应该有 x1+x2 (3,7,14)。非常抱歉。我的查询应该是: select qwert(1, x1,x2) from src; (因此混乱,我认为......)

标签: postgresql user-defined-functions plpgsql execute dynamic-sql


【解决方案1】:

会这样工作:

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;

呼叫:

SELECT qwert('t1', ARRAY['x1','x2']);

或者:

SELECT qwert('t1', '{x1,x2}');

format() 需要 Postgres 9.1 或更高版本。

我使用text 参数作为临时表名,array of text 作为列名,然后使用unnest()quote_ident()string_agg() 的组合构建表达式。不要忘记为该列命名(在我的前任中为col_sum)。

关于sanitizing values for use as identifiers in this related answer on dba.SE的详细信息。您可以通过这种方式传递任意数量的列。

【讨论】:

  • 我运行您的代码,结果是一个值为 10,4,0,0,0 的表。我想我的问题并不清楚。我刚刚编辑。谢谢。
  • 我的表必须是选择查询的结果。我正在使用的真实表有数千条记录。
  • 谢谢。如果您也可以考虑stackoverflow.com/questions/51004980/…,我将不胜感激
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多