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

php中文网
发布: 2016-06-07 14:57:31
原创
1295人浏览过

无详细内容 无 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; --

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

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 <= v_datacycle_id loop

            v_sql := 'alter table ' || v_entity_owner || '.' ||

                     v_entity_name || ' add partition ' || v_part_style ||

                     v_part_value || '

  values less than (''' ||

                     to_char(add_months(to_date(v_part_value, 'yyyymm'), 1),

                             'yyyymm') || ''') tablespace ';

             --日志检索               

            /*dbms_output.put_line(v_sql);*/

            --需要分配分区(或者建表设置默认表空间)

            execute immediate v_sql;

            v_part_value := to_char(add_months(to_date(v_part_value,

                                                       'yyyymm'),

                                               1),

                                    'yyyymm');

          end loop;

          v_retcode := 'SUCCESS';

          v_retinfo := '成功';

        else

          /*--顺序不太好看

             select

                 rtrim(wmsys.wm_concat(' subpartition ' || substr(subpartition_name,length(partition_name)+2) || ' values ( ''' ||

                regexp_replace(substr(subpartition_name, length(partition_name)+2),'[^0-9]','') || ''' ) '),',') into v_sub_template

           from sys.dba_tab_subpartitions

          where table_owner = v_entity_owner

            and partition_name = v_part_value_max

            and table_name = v_entity_name;*/

            --有子分区且非模板子分区

          v_sub_template := 'alter table ' || v_entity_owner || '.' ||

                            v_entity_name || '

set subpartition template(';

--''' ||regexp_replace(substr(subpartition_name,length(partition_name) + 2),'[^0-9]','') || '''

          for t in (select /*+parallel(sub,4)*/*

                      from sys.dba_tab_subpartitions sub

                     where table_owner = v_entity_owner

                       and partition_name = v_part_style || v_part_value_max

                       and table_name = v_entity_name

                     order by length(regexp_replace(subpartition_name, '[0-9]', '')),subpartition_name) loop

          v_high_value:=t.high_value;

          v_subpart_value:=substr(v_high_value,1,4000);

          /*if v_subpart_value= 'DEFAULT' then

            v_subpart_value:='''DEFAULT''';

            end if;*/

            v_sub_template := v_sub_template ||' subpartition ' ||

                           substr(t.subpartition_name,

                                  length(t.partition_name) + 2) ||

                           ' values ( '||v_subpart_value||' ) ,' ;

          end loop;

          --日志检索

          dbms_output.put_line(rtrim(v_sub_template, ',') || ')');

          insert into dm_check_log

            select rtrim(v_sub_template, ',') || ')',

                   v_datacycle_id,

                   sysdate

              from dual;

          commit;

          execute immediate rtrim(v_sub_template, ',') || ')';

          v_part_value := to_char(add_months(to_date(v_part_value_max,

                                                     'yyyymm'),

                                             1),

                                  'yyyymm');

          while v_part_value <= v_datacycle_id loop

            v_sql := 'alter table ' || v_entity_owner || '.' ||

                     v_entity_name || ' add partition ' || v_part_style ||

                     v_part_value || '

  values less than (''' ||

                     to_char(add_months(to_date(v_part_value, 'yyyymm'), 1),

                             'yyyymm') || ''') tablespace ';

            /*dbms_output.put_line(v_sql);*/

          execute immediate v_sql;

            --需要分配分区(或者建表设置默认表空间)

            v_part_value := to_char(add_months(to_date(v_part_value,

                                                       'yyyymm'),

                                               1),

                                    'yyyymm');

          end loop;

          v_retcode := 'SUCCESS';

          v_retinfo := '成功';

        end if;

      end if;

    end if;

  end if;

end;

登录后复制
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号