2017-04-18 1 views
-1

ように私は、ストアドプロシージャを作成していますタイプを渡すことによって、プロシージャ内でループを行う私は、各インフォタイプにループは、ストアドプロシージャの入力のPostgreSQL

を挿入できるように、これは

create type leketo as(id integer, name text); 
私のタイプです機能を実行している私のタイプ

CREATE OR REPLACE FUNCTION getLeketo() 
    RETURNS SETOF leketo AS 
$BODY$ 
declare 
l leketo; 
begin 

l.id := 1; 
l.name := 'One'; 
return next l; 

l.id := 2; 
l.name := 'Two'; 
return next l; 


l.id := 3; 
l.name := 'Three'; 
return next l; 


l.id := 4; 
l.name := 'Four'; 
return next l; 

l.id := 5; 
l.name := 'Five'; 
return next l; 

end 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

に行を挿入

機能は私

にこれを返します。この手順で
select * from getLeketo() 

1 One 
2 Two 
3 Three 
4 Four 
5 Five 

私たちは、私はこれをしようとすると、私は次のようなメッセージ

DO $$ 
declare 
l leketo; 
begin 
select * from getLeketo() into l; 
PERFORM loopLeketo(l); 
end$$; 

ERRORを取得し、すべての行

CREATE OR REPLACE FUNCTION loopLeketo(pl leketo) 
    RETURNS void AS 
$BODY$ 
declare 
l leketo; 
begin 

for l in (select * from pl) loop 
    raise notice '----------------------------------------'; 
    raise notice 'id=%, name=%', l.id, l.name; 
end loop; 
end 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

を通過します:関係は "PL"

存在しません

答えて

1

このエラーメッセージは、お客様のケースでplのパラメータがに表示されないために表示されます。クエリの節。したがって、PostgreSQLはテーブル名としてplを解釈します。

より深刻な問題は、単一の変数に値のセットを割り当てようとすることです。これは機能しません。 SELECT ... INTOステートメントは、最初の結果を変数lにのみ格納します。

あなたが本当に達成したいものを私たちに教えていない、私はあなたが表示され、問題のための2つのアプローチを考えることができます。

  1. は、クエリを1つずつ結果ハンドル。 PL/pgSQLのコードは、次のようになります。

    DEFINE 
        l leketo; 
    BEGIN 
        FOR l IN SELECT * FROM getleketo() LOOP 
         RAISE NOTICE 'id=%, name=%', l.id, l.name; 
        END LOOP; 
    END; 
    
  2. getleketo()ないRETURNS refcursorとしてRETURNS SETOF leketoとして、しかしを定義し、それが結果のカーソルを返してきました。次に、クエリ結果全体をrefcursor型の変数に代入し、これをloopleketo関数の引数として使用できます。

    詳細はthe documentationを参照してください。

関連する問題