gpt4 book ai didi

sql - 在 EXECUTE 上传递 ROWTYPE 参数

转载 作者:行者123 更新时间:2023-11-29 12:11:01 26 4
gpt4 key购买 nike

我正在 Postgres 中开发一个函数,旨在为查询的每条记录恢复一组函数中包含的检查结果的值。这些函数中只有一个会返回正确的值。这些函数有一个公共(public)前缀“fn_condicao_”,并接收一个“my_table”类型的对象作为参数。

由于进行检查的函数数量未知,我决定查阅 Postgres 目录,从表 pg_catalog.pg_proc 中搜索前缀为 'fn_condicao_' 的函数并动态执行它们执行。

我的问题是如何为 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;

如何在上面函数的注释EXECUTE命令中正确传递v_record

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;

最佳答案

我相信你的问题是你的函数中的 execute 命令试图插入 v_record 的值,这实际上将它变成了一个离散的参数列表,而不是函数期望的 native 行类型。

如果您愿意更改每个函数的参数类型,这可能是处理此问题的最简单方法。如果不是,那么您需要某种方式将 native 行类型传递给动态函数调用。尽管这看起来很糟糕,但我认为这样的事情会奏效:

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 '
do $ZOOM$
declare
v_rec my_table%rowtype;
begin
select *
into v_rec
from my_table
where id = ' || v_record.id || ';

perform ' || func_name || '(v_rec);
end;
$ZOOM$
';
end loop;
end loop;
end;
$$

此外,我认为您需要将 select 更改为 perform(如上所述)...或者执行 select into.

关于sql - 在 EXECUTE 上传递 ROWTYPE 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34933753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com