我想了解如何调用一个函数,该函数的名称是从select查询返回的。所以,让我们说,我有一个选择查询:
SELECT function_name FROM functions WHERE id=1;
现在让我们说,返回的函数名称是fce1 现在我想执行:
SELECT fce1(parameters);
现在我最初的想法是:
SELECT CONCAT(SELECT function_name FROM functions WHERE id=1;, "(params)");
我很确定这个想法是错的。但是我试图在不久前解决这个问题,我记得至少MS SQL能够实现我的目标以及POSTGRESQL。无论如何,我既不记得也不知道如何去做。我们将不胜感激。
答案 0 :(得分:2)
DECLARE @func NVARCHAR(50);
SELECT @func = function_name FROM functions WHERE id=1;
EXEC ('select ' + @func + '()')
答案 1 :(得分:0)
假设所有函数都返回相同的数据类型,您可以在Postgres中构建一个包装函数,您可以传递要调用的函数的ID:
create or replace function call_func(p_id integer)
returns integer
as
$$
declare
l_result integer;
l_name text;
l_params text;
begin
select function_name, parameters
into l_name, l_params
from functions
where id = p_id;
execute 'select '||l_name||'('||l_params||')'
into l_result;
return l_result;
end;
$$
language plpgsql;
注意:以上只是示例。
它对SQL注入非常开放,并且不会对参数进行任何错误检查或清理!但它可能会指出你正确的方向。
假设你有这些功能:
create or replace function foo(p_arg_1 integer, p_arg_2 integer)
returns integer
as
$$
select p_arg_1 + p_arg_2;
$$
language sql;
create or replace function bar(p_value integer)
returns integer
as
$$
select p_value * 4;
$$
language sql;
functions
表看起来像这样:
id | function_name | parameters
---+---------------+-----------
1 | fce | 42
2 | foo | 1,2
然后你可以做
select call_func(2);
或
select call_func(1);
但是,这只会在所有函数返回相同结果时才有效。例如标量函数返回单个值,或设置返回相同表定义的返回函数。