Function Postgresql:将输入键/值对转储到PL/pgSQL中的字符串变量中
我需要找到一种方法来转储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' 有没有办法将输入参数键/值对转储到变量中?如果您可以使函数具有统一的参数类型,并且可以打印数组,那么这是
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中不起作用,因此必须将所有参数硬编码为跨多个函数的字符串,以启用它们的日志记录。