2

PL/pgSQL関数の入力パラメータのキー/値ペアをダンプする方法を見つける必要があります。

CREATE OR REPLACE FUNCTION _test(A text, B text)
...
raise info 'Params dump: %', _x;
...

実行時:

select _text('HELLO', 'WORLD');

この関数は次のように情報を生成します。

'A = HELLO, B = WORLD'

入力パラメーターのキーと値のペアを変数にダンプする方法はありますか?

4

2 に答える 2

1

VARIADIC均一な引数型で関数を作成でき、配列を出力できれば可能です。名前がないため、引数名は取得できませんが、引数の位置は取得できます。

それ以外の場合は、PL / Perl、PL / Pythonなどの他のPLにあるはずですが、PL/PgSQLでは不可能です。

RECORDすべての関数引数を含むを取得できると非常に便利なので、印刷したり、hstore拡張機能にフィードしたりできますが、現在はできません。

于 2012-09-07T07:40:53.717 に答える
0

入力パラメータをダンプする厄介な方法があります:

create or replace function _tester(
  _txt text,
  _int int
) returns void
language 'plpgsql' as
$$
declare
  _out text = '';
  _rec record;
  _func_name text = '_tester';
begin

  for _rec in SELECT parameters.ordinal_position as _pos, parameters.parameter_name as _nm
  FROM information_schema.routines
  JOIN information_schema.parameters
  ON routines.specific_name=parameters.specific_name
  WHERE routines.routine_name = _func_name
  ORDER BY parameters.ordinal_position
  loop
    if _rec._pos = 1 then
       _out = _out || _rec._nm || ' = ' || $1::text || chr(10);
    elsif _rec._pos = 2 then
       _out = _out || _rec._nm || ' = ' || $2::text || chr(10);
    end if;
  end loop;

  raise notice '%', _out;
end;
$$;

select _tester('A','1');

NOTICE:  _txt = A
_int = 1

入力パラメータと同じ数のif/elsifを追加する必要があることに注意してください。その部分がもっと簡潔にできるかどうかわからない。

于 2012-09-09T12:42:23.250 に答える