当前位置:  数据库>oracle

Oracle存储过程实现导出表结构

    来源: 互联网  发布时间:2017-05-22

    本文导语: 要将Oracle数据库中的表结构全部倒出来,有分区表和非分区表,涉及到的字段有number、data、timestamp、varchar2、char。所以只针对了这几个字段的表的导出,如果表有其类型字段,则需要添加代码。分区表都是以时间做分区的,所...

要将Oracle数据库中的表结构全部倒出来,有分区表和非分区表,涉及到的字段有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)||',';
      else
        v_str :=v_column(i)||' '||v_type(i)||'('||v_length(i)||'),';
      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;


    
 
 

您可能感兴趣的文章:

  • oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)
  • 11g Oracle导出表不导出数据默认为空表的解决方法
  • Oracle exp 导出用户对象
  • oracle 数据泵导入导出介绍
  • 利用多个转储文件导出大量Oracle数据
  • linux环境下oracle条件导出数据的shell脚本怎么写
  • Linux环境中Oracle数据导入与导出备份操作
  • 用Oracle管理服务器将数据导入与导出
  • oracle的导入导出注意事项及心得分享
  • Oracle10201 RAC升级到10204后导出数据时报EXP-00056错误
  • Oracle的导入导出的问题
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Linux系统下导出ORACLE数据库出现Exporting questionable statistics.错误 处理
  • oracle 11g导出数据时报ORA 1455错误的处理方法
  • oracle数据库导入导出命令使用方法
  • 手把手教你Oracle数据库导出数据库结构到PowerDesigner
  • Oracle统计信息的导出与导入
  • 浅析Oracle对象和数据的导入导出
  • Oracle数据库密码重置、导入导出库命令示例应用
  • ORACLE EXP不能导出空表的原因分析及解决方法
  • oracle分页存储过程 oracle存储过程实例
  • Oracle自动存储管理支持库 ASMLib
  • Oracle存储过程调试简述
  • oracle的存储过程实例讲解
  • Oracle存储过程如何返回一个结果集&如何获取
  • 关于SHELL调用oracle存储过程出现的一个小问题
  • Oracle利用存储过程造数据
  • oracle数据库中查看系统存储过程的方法
  • 求教:shell 脚本怎么获取ORACLE存储过程的返回值?
  • 帮我看一下程序,java调用oracle数据存储的问题?
  • 谁有oracle存储过程的原代码?谢谢!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • shell调用oracle储存过程,怎么判断储存过程执行结果是否正确
  • Oracle事务!使用游标提交过程
  • oracle sql执行过程(流程图)
  • oracle 10g在红旗桌面版6.2的安装过程
  • redhat 9 下安装 oracle9i 过程中,要求指定java目录,到底是哪一个目录?
  • Oracle建表过程初学
  • Oracle Enterprise Linux安装过程
  • Oracle创建用户权限的过程
  • Linux主机下配置Oracle 10G自动启动过程记
  • java调oracle过程的出了问题,求助!帮忙看看
  • 急!!!linux9下安装oracle9i在configuration Tool过程出现错误,在线等待,解决立即给分!
  • UNIX服务器上使用“kill"命令终止"Oracle”过程
  • Linux下Oracle数据库优化的具体过程
  • 剖析用UNIX的kill命令终止Oracle详细过程
  • 哪位大哥能介绍一下在redhat7.2下安装oracle9i的过程和细节问题,只要有用,小弟另有送分
  • JBUILDER如何执行ORACLE的储存过程
  • 用UNIX的kill命令来终止所有的Oracle过程
  • Oracle过程与函数的区别分析
  • Oracle中如何定时调用存储过程
  • Linux AS 4上升级Oracle 10.2.0.1.0到10.2.0.4.0的过程
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,