在 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 将正确处理文字。