2017-12-11 25 views
0

テーブルに新しいレコードの数を取得するPostgres関数を書いています。ここでテーブル名は変数です。動的SQLでテーブル名の引数を使用する方法

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'に実行すると、正しく動作します。

なぜこのエラーが発生しますか?私は何を間違えたのですか?

答えて

2

パラメータシンボルはデータ値のみに使用することができることをthe documentation:

注パー - あなたが動的に決定テーブルやカラム名を使用したい場合は、テキストでコマンド文字列にそれらを挿入する必要があります。

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

format()機能を使用します

関連する問題