分类: Oracle
2012-05-08 23:29:28
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文件,可以多次从中导入只需要的表。我认为这是一个笨而简便的办法。:)