欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

为含有分区及子分区的模型添加分区。

程序员文章站 2022-05-08 08:05:38
...

无详细内容 无 create or replace procedure p_test_gy(v_datacycle_id varchar2, --添加分区的上限值 v_entity_owner varchar2, v_entity_name varchar2, v_retcode out varchar2, v_retinfo out varchar2) is v_cnt1 number; --实体检测 v_cnt2 number; --

create or replace procedure p_test_gy(v_datacycle_id varchar2, --添加分区的上限值
                                      v_entity_owner varchar2,
                                      v_entity_name  varchar2,
                                      v_retcode      out varchar2,
                                      v_retinfo      out varchar2) is

  v_cnt1           number; --实体检测
  v_cnt2           number; --分区是否存在检测
  v_cnt3           number; --模板子分区是否存在检测
  v_part_type      varchar2(30); --分区类型
  v_subpart_type   varchar2(30); --子分区类型
  v_part_value_max varchar2(30); --分区最大值
  v_part_style     varchar2(30); --分区命名格式
  v_part_value     varchar2(30); --分区值变量
  v_sql            varchar2(4000); --动态执行SQL
  v_sub_template   varchar2(4000); --调整模板子分区 
  v_high_value  long; --子分区值变量
  v_subpart_value     varchar2(30); --子分区值变量

  /*v_pkg
  v_procname */
begin
  /*--插入日志部分
  p_insert_log(v_acct_month, v_pkg, v_procname, v_prov_id, sysdate, '');*/
  --检测输入参数是否有误
  select count(0)
    into v_cnt1
    from sys.dba_objects
   where owner = v_entity_owner
     and object_name = v_entity_name
     and object_type = 'TABLE';
  if v_cnt1 = 0 then
    v_retcode := 'FAIL';
    v_retinfo := '目标表信息输入有误';
  else
    --检测目标表有无分区
    select count(0)
      into v_cnt2
      from sys.dba_part_tables t
     where t.owner = v_entity_owner
       and t.table_name = v_entity_name;
    if v_cnt2 = 0 then
      v_retcode := 'SUCCESS';
      v_retinfo := '目标表无分区';
    else
      --检测分区是否已存在
      select regexp_replace(max(t.partition_name), '[^0-9]', ''),
             regexp_replace(max(t.partition_name), '[0-9]', '')
        into v_part_value_max, v_part_style
        from sys.dba_tab_partitions t
       where t.table_owner = v_entity_owner
         and t.table_name = v_entity_name;
      select partitioning_type, subpartitioning_type
        into v_part_type, v_subpart_type
        from sys.dba_part_tables t
       where t.owner = v_entity_owner
         and t.table_name = v_entity_name;
         --分区已存在&分区是LIST/HASH分区
      if v_part_value_max >= v_datacycle_id OR v_part_type  'RANGE' then
        v_retcode := 'SUCCESS';
        v_retinfo := '分区已存在';
      else
        select count(0)
          into v_cnt3
          from sys.dba_subpartition_templates
         where table_name = v_entity_name
           and user_name = v_entity_owner;
           --无子分区&有子分区且为模板子分区
        if v_part_type = 'RANGE' AND
           ((v_subpart_type = 'LIST' AND v_cnt3  0) OR
           nvl(v_subpart_type, '**') = 'NONE') then
          v_part_value := to_char(add_months(to_date(v_part_value_max,
                                                     'yyyymm'),
                                             1),
                                  'yyyymm');
          while v_part_value