0

我正在寫一個函數執行以下操作:PostgreSQL的功能 - 執行「創建表......」 - 意外的結果

與單個字段創建一個臨時表。 該字段是特定表格中多達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是否正確創建。

有人可以幫助你嗎?

+0

對不起。我編輯了這個問題。希望現在清楚。 – Ali

+0

你需要什麼臨時表?或者,這只是一個(失敗)嘗試從函數中獲取一組行嗎?另外,你的問題仍然沒有加起來。你想從表'src'中總結'x1 + x2'嗎? –

+0

我需要一個臨時表來存儲我需要用於進一步計算的新變量。在每個會話中,我的輸入變量可能會改變我想總結五列,因此我將默認值設置爲零。作爲一個例子,我只是想總結兩列(來自src的x1和x2)。結果表應該有x1 + x2(3,7,14)。很抱歉。我的查詢應該是:從src中選擇qwert(1,x1,x2); (因此,我認爲...) – Ali

回答

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的詳細資料。您可以通過這種方式傳遞任意數量的列。

+0

我運行你的代碼,結果是一個值爲10,4,0,0,0的表。我想我的問題不清楚。我剛剛編輯。謝謝。 – Ali

+0

我的表格必須是選擇查詢的結果。我正在使用的真正表格有成千上萬的記錄。 – Ali

+0

這工作正常!謝謝歐文。 – Ali