2012-03-14 19 views
0

テーブルにデータを挿入する関数を作成しようとしています。私が使用しているクエリは、スキーマ名が変数である必要がある以外は変更されません。例えば、私のスキーマ名の1つはbscu.membersであり、35個の非常に似ているものがあります(wea.members、pcu.members .. etc etc ..)。変数を使用してPostgreSQLで関数を作成する方法に関するヘルプが見つかりませんでした。スキーマ名は、通常はどこに行くかスキーマ名の変数を使用して 'insert into'関数を作成する

これは私がこれまでに思い付いたものですが、それは

create or replace function attsummary(varchar) 
RETURNS void 
LANGUAGE plpgsql 
AS $function$ 
BEGIN 
insert into dwh.attribution_summary 
select 
m.source, 
m.name, 
m.partner_id, 
d.ucic, 
b.acct_type_desc as acct_desc, 
a.begin_mo_balance as opening_balance, 
c.date, 
h.campaignname, 
g.description as banner_desc, 
f.create_time::timestamp as time_served, 
'd' as dep_or_loan, 
'h' as home_or_nonhome 
    from 
$1.fact_deposits a 
join $1.dim_acct_type b on a.acct_type_id = b.acct_type_id 
join $1.dim_date c on a.date_id = c.date_id 
join $1.dim_members d on a.ucic = d.ucic 
join ad_delivery.sgmt_adic e on d.adic::varchar = e.adic 
join ad_delivery.sgmt_user_tracker f on e.cookie_id = f.id 
join ad_delivery.ox_banners g on g.bannerid = f.banner_id 
join ad_delivery.ox_campaigns h on h.campaignid = f.campaign_id 
join ad_delivery.sgmt_kli_adic i on e.adic = i.adic 
join dwh.sgmt_clients m on m.partner_id = i.sgmt_partner_id 
    where 
    i.kli=8616208 
    and m.partner_id::integer != 909909 

が動作していないし、その後、私のselect文は、後に来る..私は私の変数$ 1を使用しています。

+0

http://www.postgresql.org/docs/9.1/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS -EXECUTING-DYN) – dbenhur

答えて

3

それは動的

create or replace function attsummary 
(schema text) 
returns void as 
$body$ 
begin 
execute format(' 
insert into dwh.attribution_summary 
select 
    m.source, 
    m.name, 
    m.partner_id, 
    d.ucic, 
    b.acct_type_desc as acct_desc, 
    a.begin_mo_balance as opening_balance, 
    c.date, 
    h.campaignname, 
    g.description as banner_desc, 
    f.create_time::timestamp as time_served, 
    ''d'' as dep_or_loan, 
    ''h'' as home_or_nonhome 
from 
%1$s.fact_deposits a 
join %1$s.dim_acct_type b on a.acct_type_id = b.acct_type_id 
join %1$s.dim_date c on a.date_id = c.date_id 
join %1$s.dim_members d on a.ucic = d.ucic 
join ad_delivery.sgmt_adic e on d.adic::varchar = e.adic 
join ad_delivery.sgmt_user_tracker f on e.cookie_id = f.id 
join ad_delivery.ox_banners g on g.bannerid = f.banner_id 
join ad_delivery.ox_campaigns h on h.campaignid = f.campaign_id 
join ad_delivery.sgmt_kli_adic i on e.adic = i.adic 
join dwh.sgmt_clients m on m.partner_id = i.sgmt_partner_id 
where 
    i.kli=8616208 
    and m.partner_id::integer != 909909 
', $1); 
end; 
$body$ 
language plpgsql volatile 
; 
+0

なぜスキーマ名は$ 1ではなく%1 $ sですか? – precose

+1

このクエリを実行しようとすると、%1 $ sは[フォーマット関数](http://www.postgresql.org/docs/9.1/static/functions-string.html#FUNCTIONS-STRING-OTHER)のパラメータ –

+0

です: select attsummary( 'bmcu');エラー:エラー:関数形式(不明、テキスト)が存在しません。 ヒント:指定された名前と引数の型に一致する関数はありません。 明示的な型キャストを追加する必要があります。 ここで、PL/pgSQL – precose

1

を生成する必要があります@Clodoaldoはあなたの作業答えを与えたが、彼が使用するフォーマット()関数は前Pgを9.1に利用できないことに注意してください。これを古いPgインスタンスで処理する必要がある場合は、文字列式を使用して動的クエリを構築することができます。例:

CREATE SCHEMA a; 
CREATE SCHEMA b; 

CREATE TABLE a.foo (data text); 
CREATE TABLE b.foo (data text); 

CREATE OR REPLACE FUNCTION insert_with_schema(schema_name text, data text) 
    RETURNS void 
AS $$ 
BEGIN 
    EXECUTE 'INSERT INTO ' || quote_ident(schema_name) || '.foo (data) VALUES ($1)' 
    USING data; 
END 
$$ 
LANGUAGE plpgsql; 
あなたが動的に挿入ステートメントを構築する必要があります([動的ステートメントを実行する]を参照してください
+0

が疑わしいかもしれませんが、このコードにはどこで質問しますか? – precose

+1

スキーマとテーブルを設定するために、この関数定義をSQLに含めます。これを使用するには、SELECT insert_with_schema( ''、value);のようなSQL文を発行します。もちろん、複数のスキーマで使用するテーブル名と一致するように変更し、実際に挿入したい値を受け入れる必要があります。私のほうは例です。 – dbenhur

関連する問題