在 postgresql 的存储过程中使用变量来添加分区
use variable in postgresql's stored procedure to for adding a partition
我需要在存储过程中添加一个新的分区,需要用到一个varialbe,代码如下:
create or replace procedure modifyPartition()
as
declare
nextDate date;
begin
nextDate :=date_trunc('hour',sysdate);
alter table TB_MOVIL_CDR add partition ***** values less than (nextDate);
end;
/
但我收到以下错误:
错误:列 "nextDate" 不存在,原因是什么?我们可以在 "alter table" 命令中使用 varialbe 吗?
为此您需要动态 SQL。
但是你的程序还有很多错误。
Postgres 中没有 sysdate
,你必须使用 current_date
并且不需要从中删除 "hours",因为 Postgres 中的 date
不包含任何时间部分。
alter table
不是在 Postgres 中创建新分区的方法。 As documented in the manual 您需要创建一个 table 分区。
values less than
在 Postgres 中定义(范围)分区也是无效的。分区范围 table 需要分区值的开始和结束日期。所以你需要计算两个日期,而不仅仅是一个。假设你想为当月创建一个分区,你可以这样做:
create or replace procedure modify_partition()
as
$$
declare
l_partname text;
l_part_start date;
l_part_end date;
l_sql text;
begin
l_part_start = date_trunc('month', current_date)::date;
l_part_end = (date_trunc('month', current_date) + interval '1 month')::date;
l_partname := 'movil_cdr_part_'||to_char(current_date, 'yyyy_mm');
l_sql := format('CREATE TABLE %I PARTITION OF tb_movil_cdr
FOR VALUES FROM (%L) TO (%L)', l_partname, l_part_start, l_part_end);
execute l_sql;
end;
$$
language plpgsql;
format()
是为动态 SQL 创建 SQL 的首选方式。占位符 %I
将正确处理标识符。 %L
将正确处理文字。
我需要在存储过程中添加一个新的分区,需要用到一个varialbe,代码如下:
create or replace procedure modifyPartition()
as
declare
nextDate date;
begin
nextDate :=date_trunc('hour',sysdate);
alter table TB_MOVIL_CDR add partition ***** values less than (nextDate);
end;
/
但我收到以下错误:
错误:列 "nextDate" 不存在,原因是什么?我们可以在 "alter table" 命令中使用 varialbe 吗?
为此您需要动态 SQL。
但是你的程序还有很多错误。
Postgres 中没有 sysdate
,你必须使用 current_date
并且不需要从中删除 "hours",因为 Postgres 中的 date
不包含任何时间部分。
alter table
不是在 Postgres 中创建新分区的方法。 As documented in the manual 您需要创建一个 table 分区。
values less than
在 Postgres 中定义(范围)分区也是无效的。分区范围 table 需要分区值的开始和结束日期。所以你需要计算两个日期,而不仅仅是一个。假设你想为当月创建一个分区,你可以这样做:
create or replace procedure modify_partition()
as
$$
declare
l_partname text;
l_part_start date;
l_part_end date;
l_sql text;
begin
l_part_start = date_trunc('month', current_date)::date;
l_part_end = (date_trunc('month', current_date) + interval '1 month')::date;
l_partname := 'movil_cdr_part_'||to_char(current_date, 'yyyy_mm');
l_sql := format('CREATE TABLE %I PARTITION OF tb_movil_cdr
FOR VALUES FROM (%L) TO (%L)', l_partname, l_part_start, l_part_end);
execute l_sql;
end;
$$
language plpgsql;
format()
是为动态 SQL 创建 SQL 的首选方式。占位符 %I
将正确处理标识符。 %L
将正确处理文字。