按select返回的名称调用sql函数

时间:2015-06-09 11:11:48

标签: sql sql-server sql-server-2008 postgresql tsql

我想了解如何调用一个函数,该函数的名称是从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。无论如何,我既不记得也不知道如何去做。我们将不胜感激。

2 个答案:

答案 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);

但是,这只会在所有函数返回相同结果时才有效。例如标量函数返回单个值,或设置返回相同表定义的返回函数。