• 大批量复制Oracle数据表,连带复制主键约束,字段说明以及字段默认值(量产)


    DECLARE
          CURSOR tab_name_cur
          IS
              SELECT table_name
              FROM user_tables
              WHERE table_name LIKE 'GZD_GZDXX_%_2017';   
          tab_name_rec         tab_name_cur%ROWTYPE ;
          SQL_Str_Create       VARCHAR2(2500);
          SQL_Str_Comments     VARCHAR2(2500);
          SQL_Str_Pk           VARCHAR2(2500);
          Pk_column_name    user_cons_columns.column_name%TYPE;
          SQL_Str_default      VARCHAR2(2500);
        
    BEGIN
          OPEN tab_name_cur;
          LOOP
           FETCH tab_name_cur INTO tab_name_rec;
           EXIT
                WHEN tab_name_cur%NOTFOUND;
                   --dbms_output.put_line(tab_name_rec.table_name);
               --复制表
               SQL_Str_Create := ' CREATE TABLE ' || SUBSTR(tab_name_rec.table_name,1,LENGTH(tab_name_rec.table_name)-5)
                               || '_2018' || ' AS SELECT * FROM ' || tab_name_rec.table_name || ' WHERE 1=2' || ';' ;
               dbms_output.put_line(SQL_Str_Create);
               --execute IMMEDIATE SQL_Str_Create;
               --查询主键
            SELECT string_agg(cu.column_name) as  column_name INTO Pk_column_name
                        FROM user_cons_columns cu, user_constraints au
                        WHERE cu.constraint_name = au.constraint_name
                        AND au.constraint_type = 'P'
                        AND au.table_name = tab_name_rec.table_name
                        GROUP BY cu.constraint_name;
                
             --dbms_output.put_line('pk_column_name :' || tab_pk_rec.column_name || ' and constraint_name :' ||                 tab_pk_rec.constraint_name);
                       
             dbms_output.put_line('Pk_column_name--> '||Pk_column_name);   
                     
                   
                --增加主键
                SQL_Str_Pk := 'alter table ' || tab_name_rec.table_name || ' add constraint '  
                                      ||' PK_'||tab_name_rec.table_name || ' primary key('
                                      ||  Pk_column_name
                                      ||') using index tablespace USERS pctfree 10 initrans 2 '
                                      || ' maxtrans 255  storage ('
                                      || 'initial 64K next 1M minextents 1 maxextents unlimited );';
                 dbms_output.put_line(SQL_Str_Pk);     
               --查询备注
               FOR tab_commonts_rec IN
                   (SELECT column_name,comments
                   FROM user_col_comments c
                   WHERE c.table_name = tab_name_rec.table_name)
                   LOOP
                       --dbms_output.put_line('column_name :' || tab_commonts_rec.column_name || ' and                        comments :' ||tab_commonts_rec.comments);
                    --增加备注
                       SQL_Str_Comments := 'comment on column ' || tab_name_rec.table_name
                                           || '.' || tab_commonts_rec.column_name               
                                           || ' IS '  || chr(39)||tab_commonts_rec.comments ||chr(39)||  ';' ;
                    dbms_output.put_line(SQL_Str_Comments);
                END LOOP;
               
               --查询默认值
               FOR tab_commonts_default IN
                   (SELECT t.column_name as column_name,t.data_type as data_type
                FROM USER_TAB_COLS t
                WHERE TABLE_NAME =tab_name_rec.table_name)
                LOOP
                       CASE tab_commonts_default.data_type
                           WHEN 'NUMBER' THEN
                               --dbms_output.put_line(tab_commonts_default.column_name || ' is NUMBER');
                               --增加默认值
                               SQL_Str_default := 'alter table '||tab_name_rec.table_name||' modify '
                                                   || tab_commonts_default.column_name || ' default 0;';
                              dbms_output.put_line(SQL_Str_default);
                           WHEN 'VARCHAR2' THEN
                               --dbms_output.put_line(tab_commonts_default.column_name || ' is VARCHAR2');
                               SQL_Str_default := 'alter table '||tab_name_rec.table_name||' modify '
                                                   || tab_commonts_default.column_name || ' default NULL;';
                              --dbms_output.put_line(SQL_Str_default);
                           ELSE
                             dbms_output.put_line(tab_commonts_default.column_name || ' is Unknown');
                       END CASE;
                END LOOP;            
          END LOOP;
          CLOSE  tab_name_cur;          
    END;

    亲测截图:

    执行结果如下图:

  • 相关阅读:
    操作系统
    redis
    数据库原理与mysql
    计算机网络
    重写、重载、隐藏以及多态分析
    c++复习重点
    重装系统记录
    正则表达式匹配ip地址
    信号量和互斥锁的区别 互斥量与临界区的区别
    为Markdown文件生成目录
  • 原文地址:https://www.cnblogs.com/chenlaichao/p/8007189.html
Copyright © 2020-2023  润新知