如何在psql中将一个函数及其参数传递给另一个函数

时间:2019-05-20 20:09:31

标签: postgresql

我有一个函数:tickets(date, date)。我需要创建一个使用函数名称和函数参数的函数dw.process(_tbl regclass, start date, stop date),以便在运行SELECT * FROM dw.process('tickets', '2019-04-01' , '2019-04-01' );时最终运行SELECT id FROM tickets('2019-04-01' , '2019-04-01' );

这是我尝试过的

CREATE OR REPLACE FUNCTION dw.process(_tbl regclass, start date, stop date)
    RETURNS TABLE(id bigint) AS
$func$
 DECLARE
        soccer INTEGER := 3;
BEGIN
RETURN QUERY 
    EXECUTE 'SELECT id FROM ' || _tbl   
    || '(''   || start ||  '',''    | | stop  '')'  || '  WHERE '  || _tbl   || '.game_id = ' ||  soccer ;
END
$func$  LANGUAGE plpgsql;

但是运行SELECT * FROM dw.process('tickets', '2019-04-01' , '2019-04-01' ); 如果存在,则返回relation "tickets" does not exist

是否将一个函数和该函数的参数传递给在psql中可行的另一个函数?

1 个答案:

答案 0 :(得分:0)

regclass类型涉及关系(即表,视图,索引,序列或组合类型)。函数的适当类型为regproc,有关Object Identifier Types.的更多信息

另外,请阅读关于the function format()的知识,该知识在各种情况下都非常方便,尤其是在动态命令中。示例:

create or replace function dw.process(func regproc, start date, stop date)
returns table(id bigint) language plpgsql as $func$
declare
    soccer integer = 3;
begin
    return query execute format(
        'select id from %I(%L, %L) where game_id = %s',
        func, start, stop, soccer);
end $func$;