postgresql 我需要能够动态执行函数或过程,其名称将从另一个表中提取

2nc8po8w  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(95)

PostgreSQL我有一个选择标准,基于参数,我知道对于这个特定的项目,它需要调用public.dothisprocedure另一个可以是public. dothatprocedure.但是似乎只执行选择或更新SQL语句。我想我需要一种调用执行调用myUri()但是它试图启动myUri过程,当然这个过程并不存在。有类似Eval的东西吗?
尝试执行,不是我所期待的尝试调用myUri,但错误的目标...如果有人有线索或可以指出我在正确的方向,我将是最伟大的...谢谢
例如,在T-SQL中,如果@uri是目标过程,则执行@uri @dt_from = @que_from_utc,@dt_to = @que_to_utc;
但我似乎找不到在postgre中这样做的方法(我知道如何添加参数..),只需要知道如何EXEC @uri..

8e2ybdfx

8e2ybdfx1#

我不知道,但我有我的项目的例子,我有管理表中的程序列表,然后我运行他们从其他程序一个接一个。

CREATE OR REPLACE PROCEDURE stg.sp_transform_tables()
 LANGUAGE plpgsql
AS $procedure$
DECLARE 
temprow stg.transform_management%rowtype;
current_procedure varchar(255);
curr_start timestamp ;
curr_end timestamp ;
curr_duration integer;
tmi varchar(10000) ;
BEGIN

EXECUTE 'call stg.sp_exchange_rates()';

FOR temprow IN
        select * from  stg.transform_management order by run_order
    LOOP        
        current_procedure := temprow.procedure_name;
        select now() into curr_start;
        EXECUTE FORMAT('CALL %s',current_procedure);
        tmi:=FORMAT('CALL %s',current_procedure);
        select now() into curr_end;
        select  EXTRACT(EPOCH FROM (curr_end - curr_start)) AS difference into curr_duration;
        EXECUTE FORMAT('UPDATE stg.transform_management set last_run= %s%s%s,last_duration=%s where procedure_name= %s%s%s',CHR(39),curr_end,CHR(39),curr_duration,CHR(39),current_procedure,CHR(39));
        raise notice '%,%,%',current_procedure,'Execution Done',E'\n';
        raise notice '%,%,%',tmi,'Exec',E'\n';

    END LOOP;

END;
$procedure$
;
carvr3hs

carvr3hs2#

最后想得更简单
执行“调用”||普拉乌里||“();”;
我漏掉的只是字符串中的CALL。
但你所拥有的也是相似的,我认为我更喜欢你的选择,事实上与我正在努力做的非常相似
我有一个临时表,其中是由计算计划的列表填充.
我遍历列表,检查是否存在该计划的uri(过程),如果存在,则调用该过程,一旦处理完毕,就将其从列表中删除。
现在这部分已经就绪,obv足够简单,可以用于函数和传入参数,很高兴这部分工作正常。谢谢

相关问题