PostgreSQL表分区使用monthwise

时间:2018-06-07 10:28:42

标签: postgresql plpgsql

我正在创建一个shell脚本,使用逐月分区将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 :(得分:0)

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的支持......

答案 1 :(得分:0)

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