查看: 18634|回复: 42

【通用脚本分享】普通表自动转化为按月分区表的脚本

[复制链接]
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-9-17 07:40 | 显示全部楼层 |阅读模式
本帖最后由 wabjtam123 于 2013-5-18 06:57 编辑

最近我们项目组遇到非常多张表需要改造为按月分区的分区表,而且有的表非常大,这个时候该如何做最快呢?

方法1
CREATE出所有的表,把原表TAB_OLD的建表脚本拿出来,改改后,建出新的分区表的表结构,如TAB_NEW
然后把TAB_OLD INSERT INTO 到TAB_NEW中(考虑并行和NOLOGGING),然后把TABLE_OLD RENAME TABLE_BK,把TAB_NEW RENAME 为TAB_OLD
优点:由于新表是根据脚本来建的,COMMENTS,DEFAULT值,PK,CHECK,NULL,外键等属性都是全的。
缺点1:找出所有的脚本,然后手工把结构建出来,写成分区表的动作步骤好繁琐!这个问题视乎难以避免,其实不然。
缺点2:执行非常慢,因为INSERT INTO是最慢的,可能是噩梦


方法2

直接用CREATE TABLE TAB_NEW (PARTITION ....) AS SELECT * FROM TAB_OLD的方式(考虑并行和NOLOGGING)
优点:CTAS是最快的,比方法1的INSERT INTO快了许多倍!
缺点:由于新表是不是脚本来建后,在从原表导数据的方案,COMMENTS,DEFAULT值,PK,CHECK,NULL,外键等属性都是没有,
这些都需要手工来完成,如果涉及到几十张的大表改造,将非常繁琐,而且极容易因为疏忽而导致漏了将上面的属性加进新表中。

方法3
仍然选择CTAS的方式改造分区,兼顾了方法2的优点,只是这些新表的属性利用ORACLE的数据字典获取非手动来做,不再麻烦了,我们可以通过写一个程序读取各个数据字典的信息来暗地里悄悄的获取到,把方法1的第1个缺点也避免了。

由此分析可以得知,方法3是同时拥有方法1和方法2的优点,而避免了他们的共同的缺点,在大量分区表改造的方案中,这个是最快的,其实即便只有一张表需要改造,用脚本也是安全的。

下面来看看我写的方法3的脚本
(由于分区表改造后,索引涉及到是选择LOCAL还是全局的问题,还有就是索引是否是必须的问题,所以新表的索引我就不考虑自动建了,另外外键由于涉及到依赖表必须存在,否则会出错,为了安全起见,我外键也不自动建了,另外外键自动建的脚本也比较难写些,呵呵,还没构造好,必要性不是太大,所以还没认真投入)
CTAS后,我保证了tab comments ,col comments ,check,DEFAULT ,PK,null,这6大属性一定必须要有!程序也考虑了NOLOGGING和PARALLEL最终转化成普通的LOGGING和NOPARALLEL

暂时不提供自动有索引和REFERENCE,索引没上面的关键,属于更加枝节,而且是否是全局索引还是局部索引有待考察,而REFERENCE虽然重要,但是可能由于在改造中引用表还没建好而报错,因此这2大属性,可以让开发人员手工选择性的最后判断在上述都完成后,来决定新表如何增加

另:输入的表名小写皆可,代码中统一转换为UPPER



感谢大家支持和认可,说句心里话,这包真的是非常的实用,希望能帮到更多的人!
此外也请大家多关注一下俺的《收获,不止Oracle》了,这是我自认为写的最棒的一本书了,哈哈。请买时顺便写点书评
书第一次印刷后的一周时间,即第二次印刷了,真给力!
京东:http://book.jd.com/11220905.html
当当:http://product.dangdang.com/product.aspx?product_id=23224719
再次感谢!


认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-9-17 07:41 | 显示全部楼层
相关记录日志的表
create table PART_TAB_LOG
     (
      TAB_NAME    VARCHAR2(200),
      DEAL_MODEL   VARCHAR2(200),
      SQL_TEXT     VARCHAR2(4000),
      DEAL_TIME    DATE,
      remark       VARCHAR2(4000),
      exec_order1   number,
      exec_order2  number
     );



包头

create or replace package pkg_deal_part_tab
Authid Current_User
as
/*
  create by liangjb at 2010-09-16
  功能: 实现普通表到分区表自动改造工作
  参数含义:
    p_tab in varchar2,                 -----------------需要进行分区的普通表的表名
    p_deal_flag in number default 0,   -----------------0为不执行,只将脚本记录进part_tab_log的sql_text字段中,1为不仅记录,而且执行!
    p_parallel in number default 4,    -----------------分区操作中的并行度,默认为4
    p_part_colum in varchar2,          -----------------需要分区的列,本程序主要针对最常见的时间范围类型分区,按月份分区
    p_part_nums in number default 24,  -----------------默认情况下为最近一个月到后续24个月,可以自行选择
    p_tablespace IN VARCHAR2           -----------------分区表的表空间
  处理逻辑分为如下几个程序:
    P_RENAME (p_tab); ---将原表先RENAME为YYYYMMDD的后缀名的表
    p_ctas (p_tab ,p_deal_flag, p_part_colum,p_parallel ,p_tablespace ); ---CTAS建立除部分分区的分区表
    p_split_part(p_tab ,p_deal_flag,p_part_nums ,p_tablespace); ---将分区表分区完整
    p_deal_comments(p_tab,p_deal_flag);  --增加分区表的注释
    p_deal_default (p_tab,p_deal_flag);  --增加分区表的默认值判断
    p_deal_check   (p_tab,p_deal_flag);  --增加分区表的CHECK判断
    P_DROP_CONS_IDX(P_TAB||YYYYMMDD,p_deal_flag); ---将RENAME后的表的索引和约束删除,以方便新表建索引和约束不会冲突
-------------------------------------------------------------------------------------------------------------------------------
  注意:
    1. PART_TAB_LOG是用来记录操作日志的
    create table PART_TAB_LOG
     (
      TAB_NAME    VARCHAR2(200),
      DEAL_MODEL   VARCHAR2(200),
      SQL_TEXT     VARCHAR2(4000),
      DEAL_TIME    DATE,
      remark       VARCHAR2(4000),
      exec_order1   number,
      exec_order2  number
     )
     2.在不执行脚本,只获取脚本时,脚本可以用如下方式获取,并手工执行
     select sql_text||';' from part_tab_log t where tab_name='ts_real_datatrance' order by exec_order1,exec_order2
------------------------------------------------------------------------------------------------------------------------------
   执行方法:
     set serveroutput on size 1000
     exec pkg_deal_part_tab.p_main(p_tab => 'ts_real_datatrance', p_deal_flag => 1, p_parallel => 4, p_part_colum => 'trans_date',p_part_nums=> 24,p_tablespace => 'TBS_BOSSWG');
   或者可以如下让p_deal_flag => 0,只将执行脚本记录进part_tab_log表中,而并不真正执行
     set serveroutput on size 1000
     exec pkg_deal_part_tab.p_main(p_tab => 'ts_real_datatrance', p_deal_flag => 0, p_parallel => 4, p_part_colum => 'trans_date',p_part_nums=> 24,p_tablespace => 'TBS_BOSSWG');
----------------------------------------------------------------------------------------------------------------------------------
*/
   procedure p_rename (p_tab in varchar2 );
   procedure p_ctas (p_tab in varchar2,
                     p_deal_flag in number,
                     p_part_colum in varchar2,
                     p_parallel in number default 4,
                     p_tablespace IN VARCHAR2);
   procedure p_split_part(p_tab in varchar2,
                          p_deal_flag in number,
                          p_part_nums in number default 24,
                          p_tablespace IN VARCHAR2);
   procedure p_deal_tab_comments  (p_tab in varchar2,p_deal_flag in number);
   procedure p_deal_col_comments  (p_tab in varchar2,p_deal_flag in number);
   procedure p_deal_default_and_nullable (p_tab in varchar2,p_deal_flag in number);
   procedure p_deal_check   (p_tab in varchar2,p_deal_flag in number );
   procedure p_deal_pk      (p_tab in varchar2,p_deal_flag in number );
   procedure p_drop_cons_idx (p_tab in varchar2,p_deal_flag in number);
   procedure p_main (p_tab in varchar2,
                     p_deal_flag in number default 0,
                     p_parallel in number default 4,
                     p_part_colum in varchar2,
                     p_part_nums in number default 24,
                     p_tablespace IN VARCHAR2);
end pkg_deal_part_tab;

[ 本帖最后由 wabjtam123 于 2010-10-7 22:23 编辑 ]

试验脚本.txt

2.09 KB, 下载次数: 264

pkg_deal_part_tab_20101006.sql

20.08 KB, 下载次数: 230

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-9-17 07:41 | 显示全部楼层
包体

create or replace package body pkg_deal_part_tab
as
  YYYYMMDD      VARCHAR2(50) :=TO_CHAR(TRUNC(SYSDATE),'yyyymmdd');
  V_CNT_TAB     NUMBER(9) :=0;
  V_CNT_RE_TAB  NUMBER(9) :=0;
  V_CNT_IDX     NUMBER(9) :=0;
  V_CNT_CONS    NUMBER(9) :=0;
  v_sql         varchar2(4000);
  v_first_day   date;
  v_next_day    date;
  v_prev_day    date;

  
  procedure p_insert_log(p_tab in varchar2,v_deal_model in varchar2,v_sql_text in varchar2,v_remark in varchar2 default null,v_exec_order1 number default 0,v_exec_order2 number default 0)
  as
  /*
   功能:记录日志,将各步骤中拼的SQL保存起来
  */
  begin
     insert into PART_TAB_LOG (TAB_NAME ,deal_model,SQL_TEXT,DEAL_TIME,REMARK,exec_order1,exec_order2)  values (p_tab,v_deal_model,v_SQL_text,SYSDATE,v_remark,v_exec_order1,v_exec_order2);
     commit;
  end p_insert_log;


  procedure p_if_judge(v_sql in varchar2,p_deal_flag in number )
  as
  /*
   功能:在获取到V_SQL的动态SQL后,是否EXECUTE IMMEDIATE执行前做一个判断,
         根据p_deal_flag的入参而定,0为不执行,非0为执行
  */
  begin
   if p_deal_flag=0 then
    null;
   else
      execute immediate(v_sql);
   end if;
  end p_if_judge;


  procedure p_rename (p_tab in varchar2)
  as
  /*
   功能:将原表重命名为_yyyymmdd格式的表名
  */
  begin
  SELECT  COUNT(*)   INTO V_CNT_RE_TAB FROM user_objects where object_name=UPPER(P_TAB||YYYYMMDD);
    if V_CNT_RE_TAB=0 then
           v_sql:= 'rename '||P_TAB ||' to '||P_TAB||'_'||YYYYMMDD;
           p_insert_log(p_tab,'P_RENAME',v_sql,'完成原表的重命名,改为_YYYYMMDD形式',1);
           execute immediate(v_sql); --这里无需做判断,rename动作真实完成!如果后续只是为生成脚本而不是真实执行分区操作,最后再把这个表RENAME回去!
           ELSE  DBMS_OUTPUT.PUT_LINE('备份表'||P_TAB||'_'||YYYYMMDD||'已存在');
    end if;
    DBMS_OUTPUT.PUT_LINE('将'||p_tab ||' 表RENMAE成 '||p_tab||'_'||YYYYMMDD||',并删除其约束索引等');
  end p_rename;


  procedure p_ctas (p_tab in varchar2,
                    p_deal_flag in number,
                    p_part_colum in varchar2,
                    p_parallel in number default 4,
                    p_tablespace IN VARCHAR2)
  as
   /*
   功能:用CREATE TABLE AS SELECT 的方式从RENAME的_yyyymmdd表中新建出一个只有MAXVALUE的初步分区表
  */
  begin
    v_sql:='create table '||p_tab ||'
        partition by range ( '||p_part_colum||' )
        (
        partition P_MAX    values less than (maxvalue)
        )
        nologging
        parallel 4
        tablespace '||p_tablespace||'
     as select /*+parallel(t,'||p_parallel||')*/ *
    from '|| P_TAB||'_'||YYYYMMDD;
       p_insert_log(p_tab,'p_ctas',v_sql,'完成CTAS建初步分区表',2,1);
       p_if_judge(v_sql,p_deal_flag);
       v_sql:='alter table '|| p_tab ||' logging';
       p_insert_log(p_tab,'p_ctas',v_sql,'将新分区表修改回LOGGING属性',2,2);
       p_if_judge(v_sql,p_deal_flag);
       v_sql:='alter table '|| p_tab || ' noparallel';
       p_insert_log(p_tab,'p_ctas',v_sql,'将新分区表修改回NOPARALLEL属性',2,3);
       p_if_judge(v_sql,p_deal_flag);
    DBMS_OUTPUT.PUT_LINE('通过CTAS的方式从 '||p_tab||'_'||YYYYMMDD|| ' 中新建'||p_tab ||'表,完成初步分区改造工作');
   end p_ctas;


  procedure p_split_part (p_tab in varchar2,
                          p_deal_flag in number,
                          p_part_nums in number default 24,
                          p_tablespace IN VARCHAR2)
  as
  /*
   功能:将CREATE TABLE AS SELECT 的方式新建出一个只有MAXVALUE的初步分区表进行SPLIT,
   按月份进行切分,默认p_part_nums产生24个分区,构造2年的分区表,第一个分区为当前月的
   上一个月
  */
  begin
   select to_date(to_char(sysdate, 'yyyymm') || '01', 'yyyymmdd')
          into v_first_day
          from dual;
    for i in 1 .. p_part_nums loop
       select add_months(v_first_day, i) into v_next_day from dual;
       select add_months(v_next_day, -1) into v_prev_day from dual;
       v_sql := 'alter table '||p_tab||' split partition p_MAX at ' ||
               '(to_date(''' || to_char(v_next_day, 'yyyymmdd') ||
               ''',''yyyymmdd''))' || 'into (partition PART_' ||
               to_char(v_prev_day, 'yyyymm') || ' tablespace '|| p_tablespace||' ,partition p_MAX)';
       p_insert_log(p_tab,'p_split_part',v_sql,'分区表完成分区SPLIT工作',3,i);
       p_if_judge(v_sql,p_deal_flag);
    end loop;
  DBMS_OUTPUT.PUT_LINE('对新建的'||p_tab ||'分区表完成分区SPLIT工作');
  end p_split_part;


  procedure p_deal_tab_comments  (p_tab in varchar2,p_deal_flag in number)
  as
  /*
   功能:从_YYYYMMDD备份表中得到表和字段的注释,为新分区表的表名和字段增加注释
  */
  begin
    for i in (select * from user_tab_comments where table_name=UPPER(P_TAB)||'_'||YYYYMMDD) loop
      v_sql:='comment on table '||p_tab||' is '|| ''''||i.COMMENTS||'''';
      p_insert_log(p_tab,'p_deal_comments',v_sql,'将新分区表的表的注释加上',4,1);
      p_if_judge(v_sql,p_deal_flag);
    end loop;
  DBMS_OUTPUT.PUT_LINE('对'||p_tab ||'表增加表名的注释内容');
  end p_deal_tab_comments;

  procedure p_deal_col_comments  (p_tab in varchar2,p_deal_flag in number)
  as
  /*
   功能:从_YYYYMMDD备份表中得到表和字段的注释,为新分区表的表名和字段增加注释
  */
  begin
    for i in (select * from user_col_comments where table_name=UPPER(P_TAB)||'_'||YYYYMMDD) loop
      v_sql:='comment on column '||p_tab||'.'||i.COLUMN_NAME||' is '|| ''''||i.COMMENTS||'''';
      p_insert_log(p_tab,'p_deal_col_comments',v_sql,'将新分区表的列的注释加上',4,2);
      p_if_judge(v_sql,p_deal_flag);
    end loop;
  DBMS_OUTPUT.PUT_LINE('对'||p_tab ||'表增加列名及字段的注释内容');
  end p_deal_col_comments;

  procedure p_deal_default_and_nullable (p_tab in varchar2,p_deal_flag in number)
  as
  /*
   功能:从_YYYYMMDD备份表中得到原表的DEFAULT值,为新分区表的表名和字段增加DEFAULT值
  */
  begin
    for i in (select * from user_tab_columns where table_name=UPPER(P_TAB)||'_'||YYYYMMDD and data_default is not null) loop
     v_sql:='alter table '||p_tab||' modify '||i.COLUMN_NAME ||' default ' ||i.data_default;
     p_insert_log(p_tab,'p_deal_default',v_sql,'将新分区表的默认值加上',5);
     p_if_judge(v_sql,p_deal_flag);
    end loop;
  DBMS_OUTPUT.PUT_LINE('对'||p_tab ||'表完成默认DEFAULT值的增加');
  end p_deal_default_and_nullable;


  procedure p_deal_check (p_tab in varchar2,p_deal_flag in number)
  as
  /*
   功能:从_YYYYMMDD备份表中得到原表的CHECK值,为新分区表增加CHECK值
   另注:
    user_constraints已经包行了非空的判断,可以略去如下类似的从user_tab_columns获取非空判断的代码编写来判断是否
    for i in (select * from user_tab_columns where table_name=UPPER(P_TAB)||'_'||YYYYMMDD and nullable='N') loop
     v_sql:='alter table '||p_tab||' modify '||i.COLUMN_NAME ||' not null';
  */
  begin
    for i in (select * from user_constraints where table_name=UPPER(P_TAB)||'_'||YYYYMMDD and constraint_type='C') loop
      v_sql:='alter table '||P_TAB||'_'||YYYYMMDD ||' drop constraint ' || I.CONSTRAINT_NAME;
      p_insert_log(p_tab,'p_deal_check',v_sql,'将备份出来的原表的CHECK删除',6,1);
      p_if_judge(v_sql,p_deal_flag);
      v_sql:='alter table '||p_tab||' ADD CONSTRAINT '||I.CONSTRAINT_NAME||' CHECK ('||I.SEARCH_CONDITION ||')' ;
      p_insert_log(p_tab,'p_deal_check',v_sql,'将新分区表的CHECK加上',6,2);
      p_if_judge(v_sql,p_deal_flag);
    end loop;
  DBMS_OUTPUT.PUT_LINE('对'||p_tab ||'完成CHECK的约束');
  end p_deal_check;

  procedure p_deal_pk (p_tab in varchar2,p_deal_flag in number)
  as
  /*
   功能:从_YYYYMMDD备份表中得到原表的主键信息,为新分区表增加主键值,并删除旧表主键
  */
  begin
    for i in
    (WITH T AS
     (SELECT INDEX_NAME,TABLE_NAME,COLUMN_NAME
          from USER_IND_COLUMNS
          where index_name in (select index_name
                                from sys.user_constraints t
                               WHERE TABLE_NAME =UPPER(P_TAB)||'_'||YYYYMMDD
                                 and constraint_type = 'P')
      )
     SELECT INDEX_NAME,TABLE_NAME, MAX(substr(sys_connect_by_path(COLUMN_NAME, ','), 2)) str
    FROM (SELECT  column_name,INDEX_NAME,TABLE_NAME, row_number() over(PARTITION BY INDEX_NAME,TABLE_NAME ORDER BY COLUMN_NAME) rn
          FROM T) t
    START WITH rn = 1
    CONNECT BY rn = PRIOR rn + 1
    AND INDEX_NAME = PRIOR INDEX_NAME
    GROUP BY INDEX_NAME,T.TABLE_NAME
) loop
     v_sql:= 'alter table '||i.table_name||' drop constraint '||i.index_name|| ' cascade';
      p_insert_log(p_tab,'p_deal_check',v_sql,'将备份出来的原表的主键删除',7,1);
      p_if_judge(v_sql,p_deal_flag);
      v_sql:='ALTER TABLE '||p_tab||' ADD CONSTRAINT '||I.INDEX_NAME||' PRIMARY KEY ('||I.STR||')' ;
      p_insert_log(p_tab,'p_deal_pk',v_sql,'将新分区表的主键加上',7,2);
      p_if_judge(v_sql,p_deal_flag);
    end loop;
  DBMS_OUTPUT.PUT_LINE('对'||p_tab ||'完成主键的增加');
  end p_deal_pk;
  procedure p_drop_cons_idx (p_tab in varchar2,p_deal_flag in number)
  as
  /*
   功能:将索引,外键依赖等删除,此处的p_tab一般是带入p_tab||yyyymmdd 这个备份表(主键,约束前面已经删除了)
  */
  BEGIN
    SELECT  COUNT(*)   INTO V_CNT_TAB    FROM user_objects where object_name=UPPER(P_TAB);
    SELECT  COUNT(*)  INTO V_CNT_IDX   FROM user_indexes where table_name=UPPER(P_TAB) AND INDEX_NAME NOT IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS);
    SELECT  COUNT(*)   INTO V_CNT_CONS   FROM USER_CONSTRAINTS WHERE table_name=UPPER(P_TAB) AND constraint_type in ('R');
     IF  V_CNT_TAB >0 THEN
       if V_CNT_IDX>0 then
        FOR I IN (SELECT * from user_indexes where table_name=UPPER(p_tab) AND INDEX_NAME NOT IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS)) loop
           v_sql:= 'drop index '||i.index_name;
           p_insert_log(p_tab,'P_DROP_CONS_IDX',v_sql,'删除原表索引',9);
           update PART_TAB_LOG set tab_name=replace(p_tab,'_'||YYYYMMDD,'') WHERE TAB_NAME=P_TAB;
           COMMIT;
           p_if_judge(v_sql,p_deal_flag);
        end loop;
        else  DBMS_OUTPUT.PUT_LINE(P_TAB||'索引不存在,无需删除索引');
       end if;
       if V_CNT_CONS>0 then
         FOR I IN (SELECT * FROM USER_CONSTRAINTS WHERE table_name=UPPER(p_tab) AND constraint_type in ('C','R')) LOOP
           v_sql:= 'alter table '||i.table_name||' drop constraint '||i.constraint_name;
           p_insert_log(p_tab,'p_drop_cons_idx',v_sql,'删除原表CHECK及FK外键' ,9);
           update PART_TAB_LOG set tab_name=replace(p_tab,'_'||YYYYMMDD,'') WHERE TAB_NAME=P_TAB;
           COMMIT;
           p_if_judge(v_sql,p_deal_flag);
         END LOOP;
         else  DBMS_OUTPUT.PUT_LINE(P_TAB||'CHECK及FK外键不存在,无需删除此类约束');
       end if;
    ELSE
      DBMS_OUTPUT.PUT_LINE('原表'||p_tab||'不存在');
    END IF;
  END p_drop_cons_idx;

  procedure p_main (p_tab in varchar2,                --需要进行分区改造的表名
                    p_deal_flag in number default 0,  --0为不执行,只将脚本记录进part_tab_log的sql_text字段中,1为不仅记录,而且执行!
                    p_parallel in number default 4,   --并行度设置
                    p_part_colum in varchar2,         --需要分区的列(时间范围分区)
                    p_part_nums in number default 24, --需要分区的分区数
                    p_tablespace IN VARCHAR2)         --分区的表空间
  as
  begin
        delete from  part_tab_log where tab_name=p_tab;
        commit;
        p_rename (p_tab); ---将原表先RENAME为YYYYMMDD的后缀名的表
        p_ctas (p_tab ,p_deal_flag, p_part_colum,p_parallel ,p_tablespace ); ---CTAS建立除部分分区的分区表
        p_split_part(p_tab ,p_deal_flag,p_part_nums ,p_tablespace); ---将分区表分区完整
        p_deal_tab_comments(p_tab,p_deal_flag);  --增加分区表的表注释
        p_deal_col_comments(p_tab,p_deal_flag);  --增加分区表的列注释
        p_deal_default_and_nullable (p_tab,p_deal_flag);  --增加分区表的默认值   
        p_deal_check   (p_tab,p_deal_flag);  --增加分区表的CHECK
        p_deal_pk      (p_tab,p_deal_flag);  --增加分区表的主键
        p_drop_cons_idx(p_tab||'_'||YYYYMMDD ,p_deal_flag); ---将RENAME后的表的索引和约束删除,以方便新表建索引和约束不会冲突
        if p_deal_flag=0 then
        DBMS_OUTPUT.PUT_LINE('请特别留意!!!,以上只是对'||p_tab ||'进行生成脚本动作,未真正执行分区改造等执行动作,脚本可从part_tab_log中获取');
        DBMS_OUTPUT.PUT_LINE('如果需要真正完成执行动作,请将pkg_deal_part_tab.p_main的 p_deal_flag参数值设置为非0值,如1');
        execute immediate 'rename '||P_TAB||'_'||YYYYMMDD ||' to '||P_TAB; --即便只获取脚本而无需执行,前面RENAME的动作也必须真实完成,因为很多数据字典信息要取自_YYYYMM表的信息,因此前面必须执行,只好在这里最后再RENAME替换回去
        else
        DBMS_OUTPUT.PUT_LINE('对'||p_tab ||'已经完成了操作分区改造等执行步骤,脚本可从part_tab_log中获取');
        end if;
   end p_main;


end pkg_deal_part_tab;

[ 本帖最后由 wabjtam123 于 2010-9-17 11:27 编辑 ]

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-9-17 07:49 | 显示全部楼层
测试表(有NULL,有DEFAULT,有TAB COMMENTS,有COL COMMENTS, 有CHECK,有PK )
此外需要注意到:这个表的主键是联合主键,开发代码中构造主键脚本时要留意这个问题

create table IDEP_GOODS_LOG  (
   GOODS_ID             NUMBER(13)                      not null,
   STORE_TYPE           VARCHAR2(3)                     not null,
   DATA_ID              NUMBER(9)                       not null,
   STORE_DIR            VARCHAR2(200),
   STORE_SIZE           NUMBER(12)                      not null,
   STORE_NAME           VARCHAR2(250)                   not null,
   GENERATE_TIME        DATE,
   STATE                VARCHAR2(3)                    default '0SA' not null,
   CLEAN_TIME           DATE,
   BACKUP_TIME          DATE
)
tablespace "&IDEP_LOG";
comment on table IDEP_GOODS_LOG is
'货品跟踪日志';
comment on column IDEP_GOODS_LOG.GOODS_ID is
'货品标识ID';
comment on column IDEP_GOODS_LOG.STORE_TYPE is
'货品区域类型';
comment on column IDEP_GOODS_LOG.DATA_ID is
'数据目录ID';
comment on column IDEP_GOODS_LOG.STORE_DIR is
'文件目录';
comment on column IDEP_GOODS_LOG.STORE_SIZE is
'文件大小';
comment on column IDEP_GOODS_LOG.STORE_NAME is
'文件名';
comment on column IDEP_GOODS_LOG.GENERATE_TIME is
'生成时间';
comment on column IDEP_GOODS_LOG.STATE is
'生命周期状态';
comment on column IDEP_GOODS_LOG.CLEAN_TIME is
'清货时间';
comment on column IDEP_GOODS_LOG.BACKUP_TIME is
'备份时间';
alter table IDEP_GOODS_LOG
   add constraint CKC_STORE_TYPE_IDEP_GOO check (STORE_TYPE in ('0SA','0SB','0SC','0SD','0SE','0SF'));
alter table IDEP_GOODS_LOG
   add constraint CKC_STA_IDEP_GOO_L check (STATE in ('0SA','0SB','0SC'));
alter table IDEP_GOODS_LOG
   add constraint PK_IDEP_GOODS_LOG primary key (GOODS_ID, STORE_TYPE, DATA_ID)
      using index
    tablespace "&IDEP_INDEX";
create index IDX_GOODS_LOG_INX1 on IDEP_GOODS_LOG (
   GENERATE_TIME ASC,
   STORE_DIR ASC
)
;
/*==============================================================*/
/* Index: IDEX_GOODS_LOG_CLEAR_TIME                             */
/*==============================================================*/
create index IDEX_GOODS_LOG_CLEAR_TIME on IDEP_GOODS_LOG (
   CLEAN_TIME ASC
);

[ 本帖最后由 wabjtam123 于 2010-9-17 12:08 编辑 ]

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-9-17 07:56 | 显示全部楼层
测试:
SQL> set serveroutput on size 1000
SQL> exec pkg_deal_part_tab.p_main(p_tab => 'idep_goods_log', p_deal_flag => 1, p_parallel => 4, p_part_colum => 'generate_time',p_part_nums=> 24,p_tablespace => 'TBS_BOSSWG');

将idep_goods_log 表RENMAE成 idep_goods_log_20100917,并删除其约束索引等
通过CTAS的方式从 idep_goods_log_20100917 中新建idep_goods_log表,完成初步分区改造工作
对新建的idep_goods_log分区表完成分区SPLIT工作
对idep_goods_log表增加表名的注释内容
对idep_goods_log表增加列名及字段的注释内容
对idep_goods_log表完成默认DEFAULT值的增加
对idep_goods_log完成CHECK的约束
对idep_goods_log完成主键的增加
原表idep_goods_log20100917不存在
对idep_goods_log已经完成了操作分区改造等执行步骤,脚本可从part_tab_log中获取

PL/SQL procedure successfully completed

SQL>

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-9-17 08:03 | 显示全部楼层
最终查看效果,查看脚本可知,新的表结构如下
tab comments ,col comments ,check,DEFAULT,PK,null这6大属性都有了保证,并且是分区表,暂不考虑索引,暂不考虑外键

-- Create table
create table IDEP_GOODS_LOG
(
  GOODS_ID      NUMBER(13) not null,
  STORE_TYPE    VARCHAR2(3) not null,
  DATA_ID       NUMBER(9) not null,
  STORE_DIR     VARCHAR2(200),
  STORE_SIZE    NUMBER(12) not null,
  STORE_NAME    VARCHAR2(250) not null,
  GENERATE_TIME DATE,
  STATE         VARCHAR2(3) default '0SA' not null,
  CLEAN_TIME    DATE,
  BACKUP_TIME   DATE
)
partition by range (GENERATE_TIME)
(
  partition PART_201009 values less than (TO_DATE(' 2010-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201010 values less than (TO_DATE(' 2010-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201011 values less than (TO_DATE(' 2010-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201012 values less than (TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201101 values less than (TO_DATE(' 2011-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201102 values less than (TO_DATE(' 2011-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201103 values less than (TO_DATE(' 2011-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201104 values less than (TO_DATE(' 2011-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201105 values less than (TO_DATE(' 2011-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201106 values less than (TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201107 values less than (TO_DATE(' 2011-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201108 values less than (TO_DATE(' 2011-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201109 values less than (TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201110 values less than (TO_DATE(' 2011-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201111 values less than (TO_DATE(' 2011-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201112 values less than (TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201201 values less than (TO_DATE(' 2012-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201202 values less than (TO_DATE(' 2012-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201203 values less than (TO_DATE(' 2012-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201204 values less than (TO_DATE(' 2012-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201205 values less than (TO_DATE(' 2012-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201206 values less than (TO_DATE(' 2012-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201207 values less than (TO_DATE(' 2012-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition PART_201208 values less than (TO_DATE(' 2012-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition P_MAX values less than (MAXVALUE)
    tablespace TBS_BOSSWG
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    )
);
-- Add comments to the table
comment on table IDEP_GOODS_LOG
  is '货品跟踪日志';
-- Add comments to the columns
comment on column IDEP_GOODS_LOG.GOODS_ID
  is '货品标识ID';
comment on column IDEP_GOODS_LOG.STORE_TYPE
  is '货品区域类型';
comment on column IDEP_GOODS_LOG.DATA_ID
  is '数据目录ID';
comment on column IDEP_GOODS_LOG.STORE_DIR
  is '文件目录';
comment on column IDEP_GOODS_LOG.STORE_SIZE
  is '文件大小';
comment on column IDEP_GOODS_LOG.STORE_NAME
  is '文件名';
comment on column IDEP_GOODS_LOG.GENERATE_TIME
  is '生成时间';
comment on column IDEP_GOODS_LOG.STATE
  is '生命周期状态';
comment on column IDEP_GOODS_LOG.CLEAN_TIME
  is '清货时间';
comment on column IDEP_GOODS_LOG.BACKUP_TIME
  is '备份时间';
-- Create/Recreate primary, unique and foreign key constraints
alter table IDEP_GOODS_LOG
  add constraint PK_IDEP_GOODS_LOG primary key (DATA_ID, GOODS_ID, STORE_TYPE)
  using index
  tablespace SYSTEM
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate check constraints
alter table IDEP_GOODS_LOG
  add constraint CKC_STA_IDEP_GOO_L
  check (STATE in ('0SA','0SB','0SC'));
alter table IDEP_GOODS_LOG
  add constraint CKC_STORE_TYPE_IDEP_GOO
  check (STORE_TYPE in ('0SA','0SB','0SC','0SD','0SE','0SF'));


而原表被备份为_yyyymmdd,并且各种属性都去掉(此外还包括索引等也被去掉,这些要是不去掉,新表中新建的各个属性都要冲突了!)

-- Create table
create table IDEP_GOODS_LOG_20100917
(
  GOODS_ID      NUMBER(13),
  STORE_TYPE    VARCHAR2(3),
  DATA_ID       NUMBER(9),
  STORE_DIR     VARCHAR2(200),
  STORE_SIZE    NUMBER(12),
  STORE_NAME    VARCHAR2(250),
  GENERATE_TIME DATE,
  STATE         VARCHAR2(3) default '0SA',
  CLEAN_TIME    DATE,
  BACKUP_TIME   DATE
)
tablespace TBS_BOSSWG
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table
comment on table IDEP_GOODS_LOG_20100917
  is '货品跟踪日志';
-- Add comments to the columns
comment on column IDEP_GOODS_LOG_20100917.GOODS_ID
  is '货品标识ID';
comment on column IDEP_GOODS_LOG_20100917.STORE_TYPE
  is '货品区域类型';
comment on column IDEP_GOODS_LOG_20100917.DATA_ID
  is '数据目录ID';
comment on column IDEP_GOODS_LOG_20100917.STORE_DIR
  is '文件目录';
comment on column IDEP_GOODS_LOG_20100917.STORE_SIZE
  is '文件大小';
comment on column IDEP_GOODS_LOG_20100917.STORE_NAME
  is '文件名';
comment on column IDEP_GOODS_LOG_20100917.GENERATE_TIME
  is '生成时间';
comment on column IDEP_GOODS_LOG_20100917.STATE
  is '生命周期状态';
comment on column IDEP_GOODS_LOG_20100917.CLEAN_TIME
  is '清货时间';
comment on column IDEP_GOODS_LOG_20100917.BACKUP_TIME
  is '备份时间';



---------------------------------------------------------------------------------------------------------------------------------------
此外p_deal_flag => 0 可以让程序实际不执行,只是将动作记录进PART_TAB_LOG表中(1是既记录又执行)
SQL> set serveroutput on size 1000
SQL> exec pkg_deal_part_tab.p_main(p_tab => 'idep_goods_log', p_deal_flag => 0, p_parallel => 4, p_part_colum => 'generate_time',p_part_nums=> 24,p_tablespace => 'TBS_BOSSWG');

将idep_goods_log 表RENMAE成 idep_goods_log_20100917,并删除其约束索引等
通过CTAS的方式从 idep_goods_log_20100917 中新建idep_goods_log表,完成初步分区改造工作
对新建的idep_goods_log分区表完成分区SPLIT工作
对idep_goods_log表增加表名的注释内容
对idep_goods_log表增加列名及字段的注释内容
对idep_goods_log表完成默认DEFAULT值的增加
对idep_goods_log完成CHECK的约束
对idep_goods_log完成主键的增加
请特别留意!!!,以上只是对idep_goods_log进行生成脚本动作,未真正执行分区改造等执行动作,脚本可从part_tab_log中获取
如果需要真正完成执行动作,请将pkg_deal_part_tab.p_main的 p_deal_flag参数值设置为非0值,如1

PL/SQL procedure successfully completed



然后你执行
select sql_text||';' from part_tab_log t where tab_name='idep_goods_log' order by exec_order1,exec_order2;
即可通过把这些脚本复制黏贴出来,给工程人员执行这个脚本即可!

这个就是所谓的由程序生产脚本给工程人员。

[ 本帖最后由 wabjtam123 于 2010-9-17 10:05 编辑 ]

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2010-9-17 09:48 | 显示全部楼层
好东西啊,被老狐狸大哥抢先了,谢谢彬哥分享

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-9-17 09:54 | 显示全部楼层
呵呵,我的脚本,及需要改造的测试表,都提供了,兄弟们帮我测试一下,看看有没有问题,谢谢!
估计我写的潦草,怕有BUG

使用道具 举报

回复
论坛徽章:
1
2010新春纪念徽章
日期:2010-03-01 11:08:28
发表于 2010-9-17 10:11 | 显示全部楼层
如果一个表的数据量有5000w左右,进行split的效率是怎么样呢?

使用道具 举报

回复
论坛徽章:
41
授权会员
日期:2009-03-04 17:06:25最佳人气徽章
日期:2013-03-19 17:24:25SQL极客
日期:2013-12-09 14:13:35优秀写手
日期:2013-12-18 09:29:09ITPUB元老
日期:2015-03-04 13:33:34白羊座
日期:2016-03-11 13:49:34乌索普
日期:2017-11-17 11:40:00布鲁克
日期:2018-05-21 11:21:52
发表于 2010-9-17 10:18 | 显示全部楼层
哇,厉害
建议用UTL_FILE包 直接生成txt 脚本

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表