2016-06-22 5 views
1

は、私はカーソルで使用するために私の関数にパラメータとしてテーブル名を渡す必要がありますこれを試しました:関数パラメータとしてカーソルのテーブル名を渡す方法は?</p> <pre><code>select myfunction('tableA'); </code></pre> <p>か::</p> <pre><code>select myfunction('tableB') </code></pre> <p>私が持っていると、その後のような関数を呼び出す - PostgreSQLの9.1では

create or replace function myfunction(sid text) 
returns integer as $BODY$ 
declare 
     bids cursor is select id from sid; --line 4 
begin 
     for bid in bids loop 
      --some logic 
     end loop; 
     return 1; 
end; 
$BODY$ 
language plpgsql volatile; 

私はerror on line 4を取得しています。そして、私はそれを理解しました。それは、休憩(選択、投影)が許されているところで、テーブル名を関数パラメータとして渡すことは許されていません。

これを実現する代替手段はありますか?

答えて

3

SQLコマンドでは、識別子またはキーワードではなく、値のみをパラメータ化できます。現在、SELECT,INSERT,、およびDELETEコマンドに対してのみ機能します。詳細:

あなたはplpgsqlがでEXECUTEと、動的SQLを必要としています。
FORループの暗黙カーソルと組み合わせます。これは通常、明示カーソルよりも簡単で高速です。 Instructions in the manual.

私も有効なテーブル名を安全を渡すためにregclassパラメータを使用することをお勧めします。

CREATE OR REPLACE FUNCTION myfunction(_tbl regclass) 
    RETURNS int AS 
$func$ 
DECLARE 
    bid integer; -- appropriate data type! 
BEGIN 
    FOR bid IN EXECUTE 
     'SELECT id FROM ' || _tbl 
    LOOP 
     -- statements can use bid 
     RAISE NOTICE '%', bid; 
    END LOOP; 

    RETURN 1; 
END 
$func$ LANGUAGE plpgsql; 

コール:

SELECT myfunction('tableA'); -- careful: case sensitive! 

詳細な説明:

そして一般的に、でループする必要はありません速くセットベースのソリューションがありますすべて。


あなたが積極必要カーソル、結合していないカーソルを宣言しOPEN FOR EXECUTEでそれを開いた場合:

CREATE OR REPLACE FUNCTION myfunction(_tbl text) -- could be regclass again 
    RETURNS int AS 
$func$ 
DECLARE 
    _bids refcursor; 
    _rec record; 
BEGIN 
    OPEN _bids FOR EXECUTE 'SELECT id FROM ' || quote_ident(_tbl); -- text must be escaped 

    LOOP 
     FETCH NEXT FROM _bids INTO _rec; 
     EXIT WHEN _rec IS NULL; 

     -- some logic 
     RAISE NOTICE '%', _rec.id; 
    END LOOP; 

    RETURN 1; 
END 
$func$ LANGUAGE plpgsql; 

同じコール。この密接に関連答えで詳細:

+0

は、私はこれを試してみました。実際にはカーソルの入力を宣言ブロック内で使用したいと思います。 – Spike

+0

@ Spike:これにカーソルを使用する方法をもう一度答えました。 –

+0

うまく動作します。ありがとう。 – Spike

関連する問題

 関連する問題