Разделение таблиц в PostgreSQL по месяцам - PullRequest
0 голосов
/ 07 июня 2018

Я создаю сценарий оболочки для импорта журналов PostgreSQL в таблицу с использованием разбиения по месяцам.

Я пытаюсь создать функцию log_insert с параметром $DATE.

Функция создана успешно, и журналы импортируются в соответствующие таблицы месяцев, когда я жестко кодирую имя таблицы postgres_log_jun:

 CREATE LANGUAGE plpgsql;
 create or replace function logs_insert() returns trigger as $$
 declare
 begin
    if ( new.log_time >= date_trunc('month', current_date) and new.log_time <= date_trunc('month',current_date)+'1month'::interval-'1day'::interval) then
    insert into postgres_log_jun values (new.*); 
else
    raise exception 'log_time date out of range';
end if;
return null;
end;
$$ language plpgsql;

Но то же самое я пытаюсь после объявления переменной датыгде:

EXPORT DATE=$(date +%^b)
EXPORT DATABASE=demo
psql -d $DATABASE << 'EOF'
CREATE LANGUAGE plpgsql;
create or replace function logs_insert() returns trigger as $$
declare
    tbl_var text := 'postgres_log_$DATE';
begin
    if ( new.log_time >= date_trunc('month', current_date) and new.log_time <= date_trunc('month',current_date)+'1month'::interval-'1day'::interval) then
    EXECUTE'
       insert into ' || quote_ident(tbl_var) || ' values ' (new.*);
else 
    raise exception 'log_time date out of range';
end if;
return null;
end;
$$ language plpgsql;"
EOF 

Однако это не работает.

Может кто-нибудь помочь мне решить эту проблему?

Спасибо за вашу поддержку.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018
DATE=$(date +%^b)
DATABASE=demo3
psql -d $DATABASE << EOF
   create or replace function logs_insert() returns trigger as \$\$
declare
   tbl_var text := 'postgres_log_$DATE';
   qry text;
begin
      if ( new.log_time >= date_trunc('month', current_date) and new.log_time <= date_trunc('month',current_date)+'1month'::interval-'1day'::interval) then
           qry := ' insert into ' || quote_ident(tbl_var) ||  ' SELECT (\$1).*';
           execute qry USING NEW;
     else
           raise exception 'log_time date out of range';
     end if;

    return null;
    end;
  \$\$ language plpgsql;
EOF
0 голосов
/ 07 июня 2018
declare
tbl_var text := 'postgres_log_$date';
qry text;
begin
    if ( new.log_time >= date_trunc('month', current_date) and new.log_time <= date_trunc('month',current_date)+'1month'::interval-'1day'::interval) then
         qry := ' insert into ' || quote_ident(tbl_var) ||  ' SELECT ($1).*';
         execute qry USING NEW;
    else
        raise exception 'log_time date out of range';
    end if;

    return null;
end;

Это идеальный ответ, теперь он работает для меня .... Спасибо @Rafalon за вашу поддержку ...

...