如何在动态SQL中使用表名参数

时间:2017-12-11 02:44:51

标签: postgresql plpgsql dynamic-sql

我正在编写一个Postgres函数来获取表中新记录的数量。这里的表名是一个变量。

create or replace function dmt_mas_updates(
    tb_name text,
    days integer)
    returns integer as
$$
declare
    ct integer;
begin
    execute 'select count(*) from $1 where etl_create_dtm > now() - $2 * interval ''1 days'' '
    using tb_name, days into ct;
    return ct;

end;
$$ LANGUAGE 'plpgsql'

当我使用select * from dmt_mas_updates('dmt_mas_equip_store_dim',2);调用该函数时,我在$1处出现语法错误。

如果我直接运行查询select count(*) from dmt_mas_equip_store_dim where etl_create_dtm >= interval '3 days',它可以正常运行。

为什么我收到此错误?我做错了什么?

1 个答案:

答案 0 :(得分:2)

the documentation:

  

请注意,参数符号只能用于数据值 - 如果要使用动态确定的表或列名称,则必须以文本方式将它们插入到命令字符串中。

使用format()功能:

create or replace function dmt_mas_updates(
    tb_name text,
    days integer)
    returns integer as
$$
declare
    ct integer;
begin
    execute format(
        'select count(*) from %I where etl_create_dtm > now() - $1 * interval ''1 days'' ',
        tb_name)
    using days into ct;
    return ct;

end;
$$ LANGUAGE 'plpgsql';