Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1828223
  • 博文数量: 323
  • 博客积分: 5970
  • 博客等级: 大校
  • 技术积分: 2764
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 23:13
文章分类

全部博文(323)

文章存档

2018年(2)

2017年(11)

2016年(10)

2015年(27)

2014年(2)

2013年(30)

2012年(197)

2011年(44)

分类: Oracle

2012-05-08 23:29:28

Oracle导入方法略述Posted on 2009-01-16 11:56 qiqi 阅读(610) 评论(0编辑 收藏 

1. 先看看导出
   回字有四种写法。导出有几种方法?我们看几种最常见的。
   (1)登录OEM,利用提供的导出功能。
   (2)利用PL/SQL的导出功能。可以选择数据库中的对象进行导出,对于查询结果,也可导出为TXT/CVS/TVS等文件。
   (3)SQL*Loader
        常用的是EXP工具:在命令行
        exp user/pwd@service_name file=d:\a.dmp 
        具体的语法及参数,可在命令行键入 exp help=y 查看,会有详细说明。
        至于导出为其他文件或导出到其他数据库中,可参考下文的导入方法。

2. 从其他数据库导入到Oracle
   利用ODBC、JDBC等功能,可方便地从其他数据库导入到Oracle。对于微软系列,如SQL Server、Access等,就更方便了。对于一些TXT、Excel等文件,如果嫌直接导入Oracle比较麻烦的话,先导入SQL Server再导入Oracle也是一种便捷的方法。不再赘言。

3. 从TXT文件导入Oracle
   (1)使用ORACLE的开发工具Develop2000的内嵌包TEXT_IO方式。 
   通过使用Develop2000内嵌包TEXT_IO,其中包括: 
   text_io.fopen(FileName,'w') 
   text_io.put_line(out_file,linebuf) ,text_io.get_line(in_file,linebuf) 
   text_io.fclose(out_file) 
    (2)利用ORACLE的SQLLOAD工具,实现TXT格式文件到ORACLE数据库的转换。 
    如:Sqlload userid/password@db control=控制文件名  
          sqlldr userid=c/c control=holand.ctl log=holand.log bad=holand.bad
      控制文件(ctl)可如下方式:
      #--------------------------------------------
       LOAD DATA
       INFILE *
       REPLACE
       INTO TABLE holand
       FIELDS TERMINATED BY ","    --也可写作X'09'
       (LCSH,LCZT,LCRQ,LCSJ,LCGH)
        BEGINDATA
        673969,1,20010205,174948,0000
        673969,3,20010205,174709,0000
        ...
       #--------------------------------------------
     有APPEND 、INSERT 、REPLACE 、 TRUNCATE 四种方式。细节上太多了,在实际应用中可以找相关资料看看。

4. 从Excel文件导入Oracle
    最常用的,还是SQL*Loader。
    (1) 把Excel文件另存为逗号分隔的txt文件,然后方法同上。
    (2) 存成txt文件, 再用第三方工具(如pb, delphi, toad, pl/sql dev等)导入。
    (3) 直接生成SQL语句,在Excel中利用公式生成字符串: = insert into table_name(F1,F2,F3...) VALUES(V1,V2,V3) .....然后运行SQL语句,这个不用多说了吧——很省力气的一个方法 :)
    (4) 在PL/SQL Develop中建立表,然后“+”添加数据,然后把Excel中的数据直接粘贴过去,然后commit....也很省力气,适用于小数据量,不过不是很规范哦
    
5. 从dmp文件导入
   (1)最简单的:Imp ***/***@YOUR_DB_NAME fromuser=*** touser=*** file=d:\a.dmp ,同样的,参数很多。在命令行输入 imp help=y 有详细说明。
   (2)对于只导入部分表的情况呢(假设不知道dmp中有哪些对象)?
        问题:数据库里有表2000-2500个,每次全部导出、导入很麻烦。有时候需要导入部分表。
            假设已有一个数据库完整的DMP文件,需要导入其中表名包含"ABC"字符的表,我的一种做法是:
           (a)select object_name from user_objects where instr(object_name,'ABC')>0;
           (b)Imp ***/***@YOUR_DB_NAME fromuser=*** touser=*** file=d:\a.dmp tables=(...)
           (...)中...填由(a)导出的表名。问题是,目标表太多了,上千个,组装成一个巨长的imp语句,在命令行根本无法执行。
        这样的话,用以下几种方法解决:
           (A)编辑参数文件aaaaa.par文件,然后  imp username/password parfile=aaaaa.par
           (B)生成EXP/IMP语句,每个对象分别导出/导入为一个dmp文件
                spool a.txt
                set echo off
                set head off
                select 'exp system/passwd file='||owner||'_'||table_name||'.dmp log='||owner||'_'||table_name||'.log buffer=4096000 tables=('||owner||'.'||table_name||')'
                        from user_objects where instr(object_name,'ABC')>0;
                spool off
              将a.txt改成可执行文件,或者批处理文件,直接运行之。这里只是导出,导入时也生成相应的语句就可以了。(好像不大实用哦)
     (3) 接着上面的问题,还有一种方法就是,把所有表名存入一个txt文件中,利用一个批处理程序反复运行 Imp ***/***@YOUR_DB_NAME fromuser=*** touser=*** file=d:\a.dmp tables=(表1)....  每次循环更换表名即可。这样一个完整的dmp文件,可以多次从中导入只需要的表。我认为这是一个笨而简便的办法。:)

阅读(1125) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~