Function Postgresql:将输入键/值对转储到PL/pgSQL中的字符串变量中

Function Postgresql:将输入键/值对转储到PL/pgSQL中的字符串变量中,function,postgresql,input,parameters,plpgsql,Function,Postgresql,Input,Parameters,Plpgsql,我需要找到一种方法来转储PL/pgSQL函数输入参数的键/值对: CREATE OR REPLACE FUNCTION _test(A text, B text) ... raise info 'Params dump: %', _x; ... 执行时: select _text('HELLO', 'WORLD'); 该函数将引发如下信息: 'A = HELLO, B = WORLD' 有没有办法将输入参数键/值对转储到变量中?如果您可以使函数具有统一的参数类型,并且可以打印数组,那么这是

我需要找到一种方法来转储PL/pgSQL函数输入参数的键/值对:

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

select _text('HELLO', 'WORLD');
该函数将引发如下信息:

'A = HELLO, B = WORLD'

有没有办法将输入参数键/值对转储到变量中?

如果您可以使函数具有统一的参数类型,并且可以打印数组,那么这是可能的。你没有参数名称,因为它们没有名称,但是你有参数位置

否则,在PL/PgSQL中是不可能的,尽管它应该在其他PL中,如PL/Perl、PL/Python等


如果能够获得一个包含所有函数参数的
记录,那就太好了,这样您就可以打印它,将它提供给扩展,等等,但这目前是不可能的。

转储输入参数有一种尴尬的方式:

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作为输入参数。不确定该部分是否更简洁。

不,在PL/pgSQL中不可能这样做-可能您可以编写一些扩展,如PL debugger,这样就可以了。我发现了一些信息重新扩展,其中可以像在常规数组中一样引用输入参数。另一方面,plpgsql的语法类似于输入参数的$1、$2等。也许有什么方法可以绕过它们?还是将引用作为数组?如果我可以有一个不带键的所有参数值的列表-也可以。不幸的是,由于sys config,无法为此任务添加扩展。@Endorphin不,您不能将它们作为$1、$2等动态引用。唯一的方法是执行
EXECUTE
,而
EXECUTE
d语句不能引用PL/PgSQL变量,因此无法工作。无法将参数作为
记录获取。将它们作为
数组
获取是没有意义的,因为参数可能具有不同的参数类型。谢谢。这些建议在我们的env中不起作用,因此必须将所有参数硬编码为跨多个函数的字符串,以启用它们的日志记录。