查看: 17186|回复: 54

如何实现一个功能,将oracle中一个用户下的所有表结构导出到.sql文件中

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2008-5-9 14:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我知道使用一些软件可以实现导出表结构,但是现在我需要在应用程序中实现一个功能,比如点击某一个按钮就将数据库中的表结构导入一个.sql的文件中,这个文件保存在本地硬盘上,并且保证导出来的sql语句能够直接执行。

我现在尝试了几种方法,都以失败告终了
一种是,用exp.exe动态导出文件,导出时,我把文件的后缀改为.sql了,结果有一堆乱码
另一种是,想写个存储过程,使用dbms_metadata包,不过由于我刚接触oracle,水平有限,写不出来

所以请高手帮帮我,还有什么解决办法没有?
论坛徽章:
0
2#
发表于 2008-5-9 14:42 | 只看该作者
SELECT dbms_metadata.get_ddl('TABLE', 'your_table_name') FROM dual;

如果要去除storage clause:
exec dbms_metadata.set_transform_param( dbms_metadata.session_transform, 'STORAGE', FALSE);
SELECT dbms_metadata.get_ddl('TABLE', 'your_table_name') FROM dual;

[ 本帖最后由 等待和希望 于 2008-5-9 14:44 编辑 ]

使用道具 举报

回复
论坛徽章:
0
3#
 楼主| 发表于 2008-5-9 14:42 | 只看该作者

回复 #1 irisbyjsj 的帖子

读系统表,然后组合起来,是不是比较麻烦啊?

使用道具 举报

回复
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
4#
发表于 2008-5-9 14:43 | 只看该作者
可以用powerdesgin 的反向工程
转过来后 在powerdesign中就可以生成所有表结构脚本了

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
5#
发表于 2008-5-9 14:44 | 只看该作者
找个更资深的人做这件事吧

使用道具 举报

回复
论坛徽章:
0
6#
 楼主| 发表于 2008-5-9 14:46 | 只看该作者

回复 #2 等待和希望 的帖子

我知道这个,我用的是pb,pb里面好像不能直接读clob的数据哦,所以不知道这个语句写在哪里,然后如何将结果写入一个文件。文件目录和文件是在pb程序里面创建的

使用道具 举报

回复
论坛徽章:
0
7#
 楼主| 发表于 2008-5-9 14:47 | 只看该作者

回复 #4 paulyibinyi 的帖子

在程序里面自动生成,不使用别的软件

使用道具 举报

回复
论坛徽章:
273
生肖徽章2007版:猪
日期:2008-09-27 09:35:45明尼苏达森林狼
日期:2009-01-12 14:15:09生肖徽章2007版:猪
日期:2009-01-21 16:30:59布鲁克林篮网
日期:2009-03-03 14:42:32圣安东尼奥马刺
日期:2009-03-03 14:44:41生肖徽章2007版:鸡
日期:2009-03-03 21:45:52生肖徽章2007版:牛
日期:2009-03-09 14:03:42生肖徽章2007版:猪
日期:2009-03-10 21:37:00生肖徽章2007版:羊
日期:2009-03-16 10:17:11生肖徽章2007版:虎
日期:2009-03-24 21:26:52
8#
发表于 2008-5-9 14:48 | 只看该作者
关注

使用道具 举报

回复
论坛徽章:
0
9#
 楼主| 发表于 2008-5-9 14:48 | 只看该作者

回复 #5 rollingpig 的帖子

就是一个资深的人把这个工作交给我做的,我也想试试不是

使用道具 举报

回复
论坛徽章:
0
10#
 楼主| 发表于 2008-5-9 14:53 | 只看该作者
我参考了一个高手的代码,创建了一个存储过程,如下:
create or replace procedure p_exportDLL(p_path varchar2, p_filename varchar2) is
begin
  
  declare
    l_file     UTL_FILE.FILE_TYPE;
    l_buffer   VARCHAR2(1000);
    l_amount   BINARY_INTEGER := 100;
    l_pos      INTEGER := 1;
    l_clob     clob;
    l_clob_len INTEGER;
  begin
    select dbms_metadata.get_ddl('TABLE', 'XM') into l_clob from dual;
    l_clob_len := DBMS_LOB.GETLENGTH(l_clob);
    l_file     := UTL_FILE.FOPEN(p_path,  p_filename, 'w', 1000);
         
    WHILE l_pos < l_clob_len LOOP
      DBMS_LOB.READ(l_clob, l_amount, l_pos, l_buffer);
      UTL_FILE.put(l_file, l_buffer);
      l_pos := l_pos + l_amount;
    END LOOP;
    UTL_FILE.FCLOSE(l_file);  
    --if @@error  
  end;
end p_exportDLL;

编译成功了的,但是似乎不能用,大家看看有什么问题?

[ 本帖最后由 irisbyjsj 于 2008-5-9 14:56 编辑 ]

使用道具 举报

回复

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

本版积分规则 发表回复

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