动态使用存储过程给分区表建立分区

本文介绍了一个PL/SQL存储过程,用于批量为数据库表添加分区,包括参数配置、流程实现及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE OR REPLACE Procedure add_partition(v_table_name         in varchar2,
                                          v_tablespace_name_in in varchar2,
                                          v_begin_date         in varchar2,
                                          v_end_date           in varchar2) is
 
  -- Local variables here
  i integer;

  ---分区表信息
  cursor cur_utp(v_table_name in user_tab_partitions.table_name%TYPE) is
    select *
      from (select utp.table_name,
                   utp.tablespace_name,
                   utp.partition_name,
                   utp.high_value,
                   utp.high_value_length,
                   utp.partition_position
              from user_tab_partitions utp
             where utp.table_name = UPPER(v_table_name)
             order by utp.partition_position desc) utp
     where rownum = 1;

  v_high_value         varchar2(255); --less than value信息
  v_partition_max_date timestamp; ----less than value信息的 timestamp表示形式
  v_sqlexec            VARCHAR2(2000); --DDL语句变量
  v_count              number := 0;
  v_interver           number := 1; --步长间隔 单位(天)
  v_part_name_header   varchar2(20) := 'p';
  v_part_name          varchar2(2000); --分区名
  v_partition_num      number := 0;
  v_tablespace_name    varchar2(200);
  v_end_date_inner     timestamp;
  
begin
  v_interver         := 1 ;
  v_part_name_header := upper(v_part_name_header);

  v_end_date_inner := trunc(to_timestamp(v_end_date,
                                         'syyyy-mm-dd hh24:mi:ss.ff'));
  --取值
  for utp in cur_utp(v_table_name) loop
    v_high_value         := substr(utp.high_value,
                                   11,
                                   10);
    v_partition_max_date := to_timestamp(v_high_value,
                                         'syyyy-mm-dd hh24:mi:ss.ff');
    if (to_timestamp(v_begin_date, 'syyyy-mm-dd hh24:mi:ss.ff') >
       v_partition_max_date) then
      v_partition_max_date := to_timestamp(v_begin_date,
                                           'syyyy-mm-dd hh24:mi:ss.ff');
    end if;
    v_part_name := utp.partition_name;
  
    --如果没有给默认值
    if (v_tablespace_name_in is null) then
      -- v_tablespace_name
      v_tablespace_name := utp.tablespace_name;
    else
      v_tablespace_name := v_tablespace_name_in;
    end if;
  end loop;

  if (v_part_name_header =
     substr(v_part_name, 1, length(v_part_name_header))) then
    v_partition_num := to_number(substr(v_part_name,
                                        length(v_part_name_header) + 1,
                                        length(v_part_name)));
    v_partition_num := to_number(to_char(to_date(v_partition_num,'yyyymmdd')+1,'yyyymmdd'));
  else
    dbms_output.put_line('not expect part_name header user default:' ||
                         v_part_name);
    v_partition_num := 0;
  end if;

                    := 0;
  v_partition_max_date := v_partition_max_date + v_interver;
 
 while v_partition_max_date <= v_end_date_inner loop
    
    v_SqlExec := 'ALTER TABLE ' || v_table_name || ' ADD PARTITION ' ||
                 v_part_name_header || (to_number(to_char(to_date(v_partition_num,'yyyymmdd')+i,'yyyymmdd'))) ||
                 ' values less than(TIMESTAMP''' ||
                 to_char(v_partition_max_date, 'syyyy-mm-dd hh24:mi:ss.ff') ||
                 ''') TABLESPACE ' || v_tablespace_name;
    dbms_output.put_line('创建 表分区' || i || '=' || v_SqlExec);
    --alter table IP_CONNRATE_LIMITEX_LOG add partition part_0002 values less than(TIMESTAMP'2010-08-31 00:00:00.000000') tablespace NASP_IP_LOG_TABLESPACE;
    DBMS_Utility.Exec_DDL_Statement(v_SqlExec);
    v_partition_max_date := v_partition_max_date + v_interver;
                      := i + 1;
  
  end loop;
  
  v_count := v_count + i;
  dbms_output.put_line('add partition count:' || v_count);

end add_partition;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值