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/PgSQL 中是不可能的,尽管它应该在其他 PL 中,如 PL/Perl、PL/Python 等。

能够获得RECORD包含所有函数参数的 a 会非常好,因此您可以打印它,将其提供给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 回答