设为首页 收藏本站
查看: 790|回复: 0

[经验分享] oracle存储过程实现导出表结构

[复制链接]

尚未签到

发表于 2016-8-12 06:11:17 | 显示全部楼层 |阅读模式
要将数据库中的表结构全部倒出来,有分区表和非分区表,涉及到的字段有number、data、timestamp、varchar2、char。所以只针对了这几个字段的表的导出,如果表有其类型字段,则需要添加代码。分区表都是以时间做分区的,所以导出来的分区表结构都是以时间分区的。只是根据了自己实际情况写的,根据不同的情况要改写!

存储过程带一个参数,默认为Y,导出分区表的分区,如果指定其他值,如
execu table_frame('N'),则只导出表结构。

使用方法:
1、要导出哪个用户的所有表结构,就在该用户下执行最下面的存储过程。
2、如下建立一个directory,同样要在数据库服务器D盘下建立一个名为‘结构’的文件夹。
create or replace directory DIR_DUMP as 'd:/结构';
3、执行存储过程,生成的表结构代码就在路径d:/结构下的txt文件中。

create or replace procedure table_frame(v_partition_status varchar2 default 'Y')
is
   type column_type is table of  user_tab_columns.column_name%type;
   v_column column_type;
   type data_type is table of  user_tab_columns.data_type%type;
   v_type data_type;
   type length_type is table of  user_tab_columns.data_length%type;
   v_length length_type;
   type datapre_type is table of  user_tab_columns.DATA_PRECISION%type;
   v_ldatapre datapre_type;
   type datasca_type is table of  user_tab_columns.DATA_SCALE%type;
   v_dayasca datasca_type;
   v_str clob;

   file_name UTL_FILE.file_type;
   v_tables varchar2(50);

   partition_status varchar2(3);
   partition_keywords varchar2(30);
   
   TYPE part_cursor is ref CURSOR;
   part_name part_cursor;
   
   partition_name user_tab_partitions.partition_name%type;
   high_value user_tab_partitions.high_value%type;
begin
  file_name := UTL_FILE.FOPEN('DIR_DUMP','table.txt','w');

  --判断是否需要分区
  partition_status := v_partition_status;

  --按表循环
  for j in (select table_name  from user_tables  group by table_name ) loop
   v_tables :=upper(j.table_name);
   v_str := 'create table '||v_tables||'(';

   UTL_FILE.PUT_LINE(file_name,v_str);

   --提取表的字段信息
   select column_name,data_type,data_length,DATA_PRECISION,DATA_SCALE
    bulk collect into v_column,v_type,v_length,v_ldatapre,v_dayasca
      from user_tab_columns where table_name=v_tables;

    --按字段循环
    for i in 1..v_column.count loop
      if v_type(i)= 'DATE' or v_type(i) like 'TIMESTAMP%'  then
        v_str :=v_column(i)||' '||v_type(i)||',';
      elsif v_type(i)= 'NUMBER' and v_ldatapre(i) is not null  then
        v_str :=v_column(i)||' '||v_type(i)||'('||v_ldatapre(i)||','||v_dayasca(i)||'),';
      elsif v_type(i)= 'NUMBER' and v_ldatapre(i) is  null  then
        v_str :=v_column(i)||' '||v_type(i)||',';
      elsif v_type(i)= 'CLOB' or  v_type(i)= 'BLOB' or v_type(i)= 'LONG'   then
        v_str :=v_column(i)||' '||v_type(i)||',';
      elsif v_type(i)= 'VARCHAR2' or  v_type(i)= 'NVARCHAR2' or v_type(i)= 'CHAR' then
        v_str :=v_column(i)||' '||v_type(i)||'('||v_length(i)||'),';
      else v_str := '该字段类型没有在代码中整理';
      end if;
      
      if i=v_column.count then
        v_str :=substr(v_str,1,length(v_str)-1);
      end if;

      UTL_FILE.PUT_LINE(file_name,v_str);
      
    end loop;

    --判断是否添加分区
    if partition_status = 'Y' then      
     
     SELECT nvl(max(column_name),'0') into partition_keywords  FROM USER_PART_KEY_COLUMNS
      where object_type = 'TABLE'  and name=v_tables;
      if partition_keywords != '0' then
         UTL_FILE.PUT_LINE(file_name,')partition by range ('||partition_keywords||')(');
         
         open part_name for select partition_name,high_value  from user_tab_partitions
         where table_name = v_tables;
         v_str := null;
         loop
           fetch part_name into partition_name,high_value;            
           if part_name%notfound then
             --去掉最后逗号
             v_str :=substr(v_str,1,length(v_str)-1);
             UTL_FILE.PUT_LINE(file_name,v_str);
             exit;
           end if;         
           UTL_FILE.PUT_LINE(file_name,v_str);
           v_str :='partition '||partition_name||' values less than ('||high_value||'),';
         end loop;
      end if;
    end if;

    UTL_FILE.PUT_LINE(file_name,');');
    UTL_FILE.PUT_LINE(file_name,'-------------------------------------------------------------');

    end loop;
   
    UTL_FILE.fclose_all;
end;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256363-1-1.html 上篇帖子: oracle 数据库插入时间 下篇帖子: (转) ORACLE GROUPING函数的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表