示されている例は、完全にRETURN QUERY
に置き換えることができます。 :
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
これはロットになります より速く。
一般に、可能な限り反復を避け、代わりにセット指向の操作を優先する必要があります。
return next
ループを超えることは避けられません(これは非常にまれであり、ほとんどの場合、例外処理が必要な場合に限定されます)。OUT
を設定する必要があります。 パラメータ値またはテーブルパラメータ、次にreturn next
引数なし。
この場合、問題はSELECT yr.y, 'hi';
という行です。 これは何もしません。 SELECT
の暗黙の宛先を想定しています はoutパラメータですが、そうではありません。 @petermのようにループ変数としてoutパラメータを使用するか、割り当てを使用するか、SELECT INTO
を使用する必要があります。 :
FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y)
LOOP
RAISE NOTICE 'Computing %', yr.y;
y := yr.y;
result := 'hi';
RETURN NEXT;
END LOOP;
RETURN;