我正在 Postgres 中开发一个函数,旨在为查询的每条记录恢复一组函数中包含的检查结果的值。这些函数中只有一个会返回正确的值。这些函数有一个公共前缀“fn_condicao_”,并接收一个“my_table”类型的对象作为参数。
由于进行检查的函数数量未知,我决定查阅 Postgres 目录,从表中pg_catalog.pg_proc
搜索前缀为“fn_condicao_”的函数并使用 EXECUTE 动态执行它们。
我的问题是如何为EXECUTE传递正确的形状参数。
create or replace function test_conditions()
returns void as
$$
declare
v_record my_table%rowtype;
v_function pg_proc%rowtype;
begin
set search_path = 'pg_catalog';
for v_record in (select * from my_table where id in (1,2,3)) loop
for v_function in (
SELECT p.proname
FROM pg_namespace n
JOIN pg_proc p
ON p.pronamespace = n.oid
WHERE n.nspname = 'operacional'
and p.proname like ('fn_condition\\_%')
order by p.proname)
loop
--execute 'select ' || v_function.proname || '(' || v_record || ')';
end loop;
end loop;
end;
$$
language plpgsql;
如何v_record
正确传递上述函数中的注释EXECUTE
命令?
execute 'select ' || v_function.proname || '(' || v_record || ')'; -- ???
示例函数:
create or replace function fn_condition_1(p_record my_table)
returns bigint as
$$
begin
if ($1.atributo1 > $1.atributo2) then
return 1;
end if;
return null;
end;
$$
language plpgsql;