создание функции «вставить в» с использованием переменных для имен схем - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь создать функцию для вставки данных в таблицу. Используемый мной запрос не будет изменяться, за исключением того, что имена схем должны быть переменными. Например, одно из моих имен схемы - bscu.members, а есть еще 35 очень похожих (wea.members, pcu.members ... и т. Д. И т. Я не смог найти никакой помощи в том, как создать функцию в Postgresql, используя переменные.

это то, что я придумал до сих пор, но это не работает

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 для моей переменной, где обычно указывается имя схемы.

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Должно быть динамически сгенерировано

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
;
1 голос
/ 14 марта 2012

@ Клодоальдо дал вам рабочий ответ, но учтите, что используемая им функция format () недоступна до 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...