2012-03-13 119 views
0

必須編寫一個函數,它返回2個用戶輸入數字之間的所有平方的總和。這是我寫的,但似乎無法使它工作。 例如sumAll(2,5)必須給出結果54 。Postgresql - 基本循環

CREATE OR REPLACE FUNCTION SumAll(integer,integer) RETURNS integer as $$ 
DECLARE 
    num1 ALIAS for $1; 
    num2 ALIAS for $2; 
    ret_sum integer; 
    sum1 integer; 
BEGIN 

    for i in num1..num2 LOOP 
     sum1:=i*i; 
     ret_sum=ret_sum+sum1; 
    END LOOP; 
    return ret_sum; 
END 
$$ language 'plpgsql'; 

它不工作。 我做錯了什麼?

+0

呃......這是什麼目的?具體來說,爲什麼在postgresql中做到這一點? – Corbin 2012-03-13 03:30:04

+0

那麼我剛剛開始使用postgresql.Go通過一些在線教程。試圖完成它。 – Parvesh 2012-03-13 03:33:17

回答

1

您忘記初始化一個變量,在for循環前添加ret_sum:=0;

+0

非常好。這個對我有用。忘了初始化變量。 – Parvesh 2012-03-13 03:39:48

1

編寫一個過程來迭代數字表明您沒有注意如何處理SQL中的數據集。像彙總一組數字不應該需要手動編寫一個循環(並且在plpgsql中編寫這個循環沒有發揮其優勢)。

可以產生該組使用的輔助函數generate_series範圍內的數字和方他們生產的所有值總結:

[email protected]@[local] =# SELECT x, x*x FROM generate_series(2, 5) x; 
x | ?column? 
---+---------- 
2 |  4 
3 |  9 
4 |  16 
5 |  25 
(4 rows) 

然後,只需使用SUM()聚合函數:

[email protected]@[local] =# SELECT sum(x*x) FROM generate_series(2, 5) x; 
sum 
----- 
    54 
(1 row) 
1

@pukipuki指出你的錯誤。我通常會簡化語法,但:

CREATE OR REPLACE FUNCTION sumall(_num1 int, _num2 int, OUT ret_sum int) 
    RETURNS int AS 
$BODY$ 
BEGIN 
    ret_sum := 0; 

    FOR i IN _num1 .. _num2 LOOP 
     ret_sum := ret_sum + i*i; 
    END LOOP; 
END 
$BODY$ LANGUAGE plpgsql;