我正在创建一个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
然而,这不起作用。
有人可以帮我解决这个问题吗?
感谢您的支持。
答案 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