0

テーブルから名前を照会する関数変数の値を取得できるようにしたい

静的な値からのクエリではなく、テーブルのクエリを表示するように編集されました。

    create table __test__
(
_col text
);
insert into __test__
(_col)
values('_a');

   create or replace function __test() 
    returns void
    language 'plpgsql' as
    $$
    declare
      _r record;
      _a int;
      _b int;
      _sql text;
    begin

      _a = 1;
      _b = 0;

      for _r in select _col as _nam from __test__ a loop
      -- query returns one row valued "_a"
        _sql = 'select ' || _r._nam ;
        execute _sql into _b;
      end loop;

      raise info 'value of _b %', _b;

    end;
    $$;
select __test()

関数が実行されて_b=1になるとき。それは可能ですか?

同じエラー..。

ERROR:  column "_a" does not exist
LINE 1: select _a
               ^
QUERY:  select _a
CONTEXT:  PL/pgSQL function "__test" line 15 at EXECUTE statement
4

2 に答える 2

2

質問を再構成してみましょう。あなたが 求めているのは、動的に生成されたコードを実行する機能を備えたPerl eval()関数と同等であり、「外部の字句変数が表示されます」。この例では、変数は_aですが、エラーメッセージからわかるように、動的SQLステートメントで補間することはできません。その理由は、SQLインタープリターが現在のpl / pgsql変数を認識できないため、またはそのような変数が存在するという知識さえも持っていないためです。それらはpl/pgsqlに限定されています。

ここで必要となるのは、コンテキストアウェアな動的に生成されたpl / pgsqlステートメントですが、この言語にはこの機能がありません。この機能なしで結果を達成するためのトリックが見つかるかどうかは疑わしいです。SQLとうまくインターフェースするすべての機能については、それ以外はかなり静的な言語です。

一方、これはpl/perlでは問題ありません。

于 2012-09-07T21:14:50.340 に答える
2

一時テーブルを作成し、それに変数名と値を挿入してから、それに対して選択を実行することができます。あとで片付けてください。私は以前にそのようなアプローチを使用しました。それは大丈夫です。ただし、余分なオーバーヘッドがあります。

編集:例を追加

CREATE FUNCTION switch (in_var text) RETURNS text
LANGUAGE PLPGSQL VOLATILE AS $$

declare t_test text;
    switch_vals text[];

BEGIN

   CREATE TEMPORARY TABLE switch_values (var text, value text);

   EXECUTE $e$ INSERT INTO switch_values VALUES 
       ('a', '1'), ('b', '2'), ('c', '3') $e$;

   EXECUTE $e$ SELECT value FROM switch_values WHERE var = $e$ || quote_literal(in_var)
       INTO t_test;

   DROP TABLE switch_values;

   RETURN t_test;

END; $$; 

postgres=# select switch('a');
  switch 
 --------
   1
 (1 row)
于 2012-09-08T12:19:48.397 に答える