2012-03-13 7 views
0

2つのユーザ入力番号間のすべての平方和を返す関数を書く必要があります。ここに私が書いたことはありますが、それを働かせることはできません。 など。 sumAll(2,5)は、結果を返す必要があります。 。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

Uhhh ....これは何の目的ですか?具体的には、なぜpostgresqlでこれを行うのですか? – Corbin

+0

さて、私はちょうどpostgresql.Goingいくつかのチュートリアルをオンラインで始めた。それを完了しようとしています。 – Parvesh

答えて

1

forループの前にret_sum:=0;を追加すると、1つの変数を初期化するのを忘れてしまいました。

+0

優れています。わたしにはできる。変数を初期化するのを忘れました。 – Parvesh

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; 
関連する問題