4

以下は、反復ごとにレコードがレコード変数に格納される関数です。ここでは、テーブル名がカーソル バインド変数用にハードコーディングされています。この関数を介してテーブル名をパラメーターとして渡す方法はありますか?

CREATE OR REPLACE FUNCTION test1()
  RETURNS SETOF refcursor AS 
$BODY$
DECLARE
   curs2 CURSOR FOR SELECT * FROM datas.test1000;
begin

FOR recordvar IN curs2 LOOP
   RAISE NOTICE 'recordvar: %',recordvar; 
END LOOP ;

end;
$BODY$
language plpgsql;
4

1 に答える 1

4

いいえ、バインドされたカーソルではありません。

しかし、バインドされていないカーソルを開くための名前を簡単に渡すことができます。まさにそれを行うマニュアルの例があります。

関数は次のようになります。

CREATE OR REPLACE FUNCTION test2(_tbl regclass)
  RETURNS void AS 
$func$
DECLARE
   _curs refcursor;
   rec   record;
BEGIN

OPEN _curs FOR EXECUTE
 'SELECT * FROM ' || _tbl;

LOOP
   FETCH NEXT FROM _curs INTO rec;
   EXIT WHEN rec IS NULL;

   RAISE NOTICE 'rec: %', rec; 
END LOOP;

END
$func$ language plpgsql;

特殊なFORループは、バインドされたカーソルでのみ使用できます。代替案を出しました。
この密接に関連した回答の詳細説明:
テーブル名がパラメーターであるカーソルのレコードを更新する

オブジェクト識別子型regclassを使用してテーブル名を渡し、SQL インジェクションを回避します。
詳細については、dba.SE に関するこの関連する回答を参照してください

于 2013-09-20T16:04:45.240 に答える