Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在动态SQL中使用表名参数_Postgresql_Plpgsql_Dynamic Sql - Fatal编程技术网

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

Postgresql 如何在动态SQL中使用表名参数,postgresql,plpgsql,dynamic-sql,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

我正在编写一个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'
当我用
调用函数时,从dmt\u mas\u updates中选择*(“dmt\u mas\u equipment\u store\u dim”,2),我在
$1
处发现语法错误

如果我直接运行查询
从dmt\u mas\u equipment\u store\u dim中选择count(*),其中etl\u create\u dtm>=interval'3 days'
,它会正常工作

为什么我会犯这个错误?我做错了什么

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

使用以下功能:

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';

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

使用以下功能:

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';