exp : 二进制-->数据库
sqlloader : 文本 -->数据库
oracle_loader : 文本 -->数据库
oracle_datapump : 二进制-->数据库
===================================================================================
SQL*Loader的用法:
Unloader这样的工具,Oracle 没有提供将数据导出到一个文件的工具。但是,我们可以用SQL*Plus的select 及 format 数据来输出到一个文件:
set echo off newpage 0 space 0 pagesize 0 feed off head off trimspool on
spool oradata.txt
select col1 || ',' || col2 || ',' || col3
from tab1
where col2 = 'XYZ';
spool off
另外,也可以使用使用 UTL_FILE PL/SQL 包处理:
rem Remember to update initSID.ora, utl_file_dir='c:/oradata' parameter
declare
fp utl_file.file_type;
begin
fp := utl_file.fopen('c:/oradata','tab1.txt','w');
utl_file.putf(fp, '%s, %s/n', 'TextField', 55);
utl_file.fclose(fp);
end;
当然你也可以使用第三方工具,如SQLWays ,TOAD for Quest等。
SQL*Loader 数据的提交:
一般情况下是在导入数据文件数据后提交的。
也可以通过指定 ROWS= 参数来指定每次提交记录数。
提高 SQL*Loader 的性能:
1) 一个简单而容易忽略的问题是,没有对导入的表使用任何索引和/或约束(主键)。如果这样做,甚至在使用ROWS=参数时,会很明显降低数据库导入性能。
2) 可以添加 DIRECT=TRUE来提高导入数据的性能。当然,在很多情况下,不能使用此参数。
3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志。这个选项只能和 direct 一起使用。
4) 可以同时运行多个导入任务.
常规导入与direct导入方式的区别:
常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中。
===========================================================================================
外部表的用法:
Oracle有一种表叫外部表,允许你只读访问。外部表定义为一个表,但是不在数据库中,它的数据一般存储在操作系统文件中,数据库中只存储外部表的元数据描述。它可以像数据库中普通表一样来显示外部表的数据。外部表的数据能够直接查询或者使用并行SQL。
你可以选择,连接,排序外部表数据。还可以为外部表创建视图,同义词。但是,不可以在外部表上创建索引,执行DML操作。
使用CREATE TABLE...ORGANIZATION EXTERNAL语句来定义外部表的元数据。这个定义可以认为是一个视图用来通过SQL查询外部表的数据但是不加载到数据库中。实际的机制是一种访问驱动用来读取外部表的数据。当你使用外部表卸载数据时,自动的基于select语句的数据类型创建元数据。
Oracle为外部表提供两种访问驱动:
1. 默认的访问驱动是ORACLE_LOADER。这个允许使用Oracle loader技术从外部文件读取数据。ORACLE_LOADER访问驱动提供数据匹配能力,类似于SQL*Loader工具控制文件语法的子集。
2. 第二种访问驱动是ORACLE_DATAPUMP.这个可用让你卸载数据,从数据库中读数据,插入到外部表,变成一个或多个外部文件,可以用来重新加载到数据库中。
外部表是一种很有用的方法,用来执行基本的数据抽取,传输,加载,特别是用于数据仓库中。
一、oracle_loader的用法:
假如有如下两个数据文件:
1: 数据文件的格式
F1.TXT文件:
13234,FIRSTS
46464,TESTA
F2.TEXT文件:
13234,SECONDS
46464,TEST
2:创建目录,并用DBA进行授权;
sql> create directory test_dir as 'E:temp';
sql>grant read,write on directory test_dir to users;
注意:创建完毕逻辑目录之后要把平面文件拷贝到该目录下,另外还要注意文件名字不要写错。
一定要给oracle用户对这个目录可读可写的权限,操作系统层面,如使用chmod -R 777 test_dir;
3:使用被授权的用户users创建外部表:
create table test_table
(ms_no varchar(20),
tip varchar(20),
descs varchar(20))
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY test_dir
ACCESS Parameters
(
RECORDS DELIMITED BY NEWLINE
badfile 'bad_dev.txt'
LOGFILE 'log_dev.txt'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(ms_no,tip,descs)
)
LOCATION('F1.txt','F2.txt')
)
reject limit unlimited
;
表创建完成.当然也可以导入一个文件
4:进行SELECT 操作看是否正确;
SQL>select * from test_table
结果如下:
MS_NO TIP DESCS
-------------------- -------------------- --------------------
13234 FIRSTS
46464 TESTA
13234 SECONDS
46464 TEST
5. 如何得到外部表的有关信息:
SQL> DESC DBA_EXTERNAL_TABLES;
Name Type Nullable
----------------------- ------------- - ----
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
TYPE_OWNER CHAR(3) Y
TYPE_NAME VARCHAR2(30)
DEFAULT_DIRECTORY_OWNER CHAR(3) Y
DEFAULT_DIRECTORY_NAME VARCHAR2(30)
REJECT_LIMIT VARCHAR2(40) Y
ACCESS_TYPE VARCHAR2(7) Y
ACCESS_PARAMETERS VARCHAR2(4000) Y
SQL>SELECT OWNER,TABLE_NAME,DEFAULT_DIRECTORY_NAME,ACCESS_PARAMETERSFRFROM
DBA_EXTERNAL_TABLES;
可以得到外部表的相关信息;
6. 如何得到外部路径的信息:
SQL> desc DBA_EXTERNAL_LOCATIONS;
得到该表结构:
Name Type Nullable
--------------- -------------- --------
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
LOCATION VARCHAR2(4000) Y
DIRECTORY_OWNER CHAR(3) Y
DIRECTORY_NAME VARCHAR2(30) Y
SQL> select * from DBA_EXTERNAL_LOCATIONS;
得到具体信息;
7. 更改参数:
--更改拒绝限制
ALTER TABLE aa LIMIT 100;
--更改默认目录说明
ALTER TABLE aa DIRECTORY DEFAULT DIRECTORY bdump;
--修改访问参数,如分隔符由","变为"|"
ALTER TABLE aaPARAMETERS ACCESS PARAMETERS (FIELDS TERMINATED BY '|');
--修改文件位置:
ALTER TABLE aaLOCATION('TC_REG_MNGREGIONCODE.txt');
drop table aa;
--删除目录
drop DIRECTORY bdump;
二、oracle_datapump的用法:
可以利用ORACLE_DATAPUMP功能来迁移数据到别的用户或者数据库中。
利用带AS 子查询的语句创建一个外部表,指定location,可以把表中的数据卸载到指定的文件中。
SQL> create table manager_ext
2 (
3 MGRNO,
4 MNAME
5 )
6 ORGANIZATION EXTERNAL
7 (
8 TYPE ORACLE_DATAPUMP
9 DEFAULT DIRECTORY admin_dat_dir
10 LOCATION('TEST.DMP')
11 )
12 AS SELECT ROWNUM MGRNO, MNAME FROM manager;
Table created
Executed in 0.984 seconds
SQL> select * from manager_ext;
MGRNO MNAME
---------- ------------------------------
1 SMITH
2 ALLEN.
3 BLAKE
Executed in 0.156 seconds
这个时候就在admin_dat_dir目录下产生一个二进制文件TEST.DMP,这个文件可以被别的用户,或者数据库用来加载到外部表中,从而实现数据迁移。
以下示例把数据迁移到另一用户的表中。
SQL> connect user_test/test123;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as user_test
SQL> create table manager_ext_loader
2 (
3 MGRNO number,
4 MNAME varchar2(30)
5 )
6 ORGANIZATION EXTERNAL
7 (
8 TYPE ORACLE_DATAPUMP
9 DEFAULT DIRECTORY admin_dat_dir
10 LOCATION('TEST.DMP')
11 );
Table created
Executed in 0.016 seconds
SQL> select * from manager_ext_loader;
select * from manager_ext_loader
ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错
ORA-29400: 数据插件错误KUP-04074: no write access to directory object ADMIN_DAT_DIR
ORA-06512: 在 "SYS.ORACLE_DATAPUMP", line 19
授予写权限:grant write on DIRECTORY admin_dat_dir TO user_test;
SQL> select * from manager_ext_loader;
MGRNO MNAME
---------- ------------------------------
1 SMITH
2 ALLEN.
3 BLAKE
Executed in 0.36 seconds
SQL>