args

导航

公告

Free Web Counter

文章

收藏

相册

其他

存档

Blog统计


正在读取评论……

 

1 sqlldr
用于将格式化的文本数据上载到表中去

以表emp为例
控制文件(*.ctl) 将加载一个外部数据文件*.*(含分隔符).

解决NULL的问题

load data

infile 'MinZhengData\tb_district.cvs'

into table tb_district

fields terminated by ","OPTIONALLY ENCLOSED BY '"'

TRAILING NULLCOLS 

(areacode,name,doc)

load data
infile 'c:\data\mydata.csv'
into table emp
fields terminated by "," optionally enclosed by '"'
( empno, empname, sal, deptno )

mydata.csv 如下:
10001,"Scott Tiger", 1000, 40
10002,"Frank Naude", 500, 20


首先编写一个控制命令的脚本文件emp.ctl,内容如下:

load data
append into table emp
fields terminated by '|'
(
no float external,
name char(20),
age integer external,
duty char(1),
salary float external,
upd_ts date(14) 'YYYYMMDDHH24MISS'
)

括号里对数据文件里每个数据域进行解释,以此在上载时与目标表进行比对。

除了append外,还有insert、replace、truncate等方式,与append大同小异,不作更多的解释。

再将上载数据组织成数据文件,通常以dat结尾,emp.dat内容如下:


100000000001|Tom|000020|1|000000005000|20020101000000

100000000002|Jerry|000025|2|000000008000|20020101235959

分隔符要与ctl文件中fields terminated by指定的一致,这个例子中为"|"

ctl和dat文件就绪后可以执行上载,命令为:

sqlldr dbuser/oracle control=emp.ctl data=emp.dat

"*" 代表数据文件与此文件同名,即在后面使用BEGINDATA段来标识数据。
也可以将dat文件合并在ctl文件中,ctl文件emp2.ctl改写为:

load data

infile *

append

into table emp

fields terminated by '|'

(

no float external,

name char(20),

age integer external,

duty char(1),

salary float external,

upd_ts date(14) 'YYYYMMDDHH24MISS'

)

begindata

100000000003|Mulder|000020|1|000000005000|20020101000000

100000000004|Scully|000025|2|000000008000|20020101235959

控制文件中infile选项跟sqlldr命令行中data选项含义相同,如使用infile *则表明数据在本控制文件以begin data开头的区域内。

这样命令变成:

sqlldr dbuser/oracle control=emp2.ctl

conventional path 通过常规通道方式上载。

rows:每次提交的记录数

bindsize:每次提交记录的缓冲区

readsize:与bindsize成对使用,其中较小者会自动调整到较大者

sqlldr先计算单条记录长度,乘以rows,如小于bindsize,不会试图扩张rows以填充bindsize;如超出,则以bindsize为准。

命令为:

sqlldr dbuser/oracle control=emp.ctl log=emp.log rows=10000 bindsize=8192000

direct path 通过直通方式上载,不进行SQL解析。

命令为:

sqlldr dbuser/oracle control=emp.ctl log=emp.log direct=true

2 exp

将数据库内的各对象以二进制方式下载成dmp文件,方便数据迁移。

buffer:下载数据缓冲区,以字节为单位,缺省依赖操作系统

consistent:下载期间所涉及的数据保持read only,缺省为n
direct:使用直通方式 ,缺省为n
feeback:显示处理记录条数,缺省为0,即不显示
file:输出文件,缺省为expdat.dmp
filesize:输出文件大小,缺省为操作系统最大值
indexes:是否下载索引,缺省为n,这是指索引的定义而非数据,exp不下载索引数据
log:log文件,缺省为无,在标准输出显示
owner:指明下载的用户名
query:选择记录的一个子集
rows:是否下载表记录
tables:输出的表名列表

下载整个实例
exp dbuser/oracle file=oradb.dmp log=oradb.log full=y consistent=y direct=y

user应具有dba权限

下载某个用户所有对象

exp dbuser/oracle file=dbuser.dmp log=dbuser.log owner=dbuser buffer=4096000 feedback=10000

下载一张或几张表

exp dbuser/oracle file=dbuser.dmp log=dbuser.log tables=table1,table2 buffer=4096000 feedback=10000

下载某张表的部分数据

exp dbuser/oracle file=dbuser.dmp log=dbuser.log tables=table1 buffer=4096000 feedback=10000 query=\"where col1=\'…\' and col2 \<…"

不可用于嵌套表

以多个固定大小文件方式下载某张表

exp dbuser/oracle file=1.dmp,2.dmp,3.dmp,… filesize=1000m tables=emp buffer=4096000 feedback=10000

这种做法通常用在:表数据量较大,单个dump文件可能会超出文件系统的限制

直通路径方式

direct=y,取代buffer选项,query选项不可用

有利于提高下载速度

consistent选项

自export启动后,consistent=y冻结来自其它会话的对export操作的数据对象的更新,这样可以保证dump结果的一致性。但这个过程不能太长,以免回滚段和联机日志消耗完

3 imp
 

将exp下载的dmp文件上载到数据库内。

buffer:上载数据缓冲区,以字节为单位,缺省依赖操作系统

commit:上载数据缓冲区中的记录上载后是否执行提交

feeback:显示处理记录条数,缺省为0,即不显示

file:输入文件,缺省为expdat.dmp

filesize:输入文件大小,缺省为操作系统最大值

fromuser:指明来源用户方

ignore:是否忽略对象创建错误,缺省为n,在上载前对象已被建立往往是一个正常现象,所以此选项建议设为y

indexes:是否上载索引,缺省为n,这是指索引的定义而非数据,如果上载时索引已建立,此选项即使为n也无效,imp自动更新索引数据

log:log文件,缺省为无,在标准输出显示

rows:是否上载表记录

tables:输入的表名列表

touser:指明目的用户方

上载整个实例

imp dbuser/oracle file=oradb.dmp log=oradb.log full=y buffer=4096000 commit=y ignore=y feedback=10000

上载某个用户所有对象

imp dbuser/oracle file=dbuser.dmp log=dbuser.log fromuser=dbuser touser=dbuser2 buffer=2048000 commit=y ignore=y feedback=10000

上载一张或几张表

imp dbuser2/oracle file=user.dmp log=user.log tables=table1,table2 fromuser=dbuser touser=dbuser2 buffer=2048000 commit=y ignore=y feedback=10000

以多个固定大小文件方式上载某张表

imp dbuser/oracle file=\(1.dmp,2.dmp,3.dmp,…\) filesize=1000m tables=emp fromuser=dbuser touser=dbuser2 buffer=4096000 commit=y ignore=y feedback=10000

 

 

 

 

 

 

 

以文本形式下载表数据

Oracle 没有提供将数据导出到一个文件的工具。但是,我们可以用SQL*Plusselect format 数据来输出到一个文件当然你也可以使用第三方工具,如SQLWays ,TOAD for Quest

/**

另外,也可以使用使用 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;

*/
-------------------------------------------------------------------------------
sqlplus -s dbuser/oracle </dev/null

set colsep |;

set echo off;

set feedback off;

set heading off;

set pagesize 0;

set linesize 1000;

set numwidth 12;

set termout off;

set trimout on;

set trimspool on;

spool tmp.txt;

select * from emp;

spool off;

exit

EOF

tr -d ‘ ’< tmp.txt >emp.txt 删除空格,可选
tr –d ‘ ’ oldOra.txt

tr -d ' ' <tb_resident.cvs>sss.txt

注意:一定要用spool,如果在命令行中直接用>tmp.txt可能会造成数据缺失,至少在Unixware7上如此

另:

set colsep | echo off newpage 0 space 0 pagesize 0 feed off head off trimspool on

附录B

利用Sqlldr导入数据的时候,保持*.dat中没有空白,否则失败内伤。

a、  insert,为缺省方式,在数据装载开始时要求表为空
b、append,在表中追加新记录
c、replace替换

注意NULL的问题

2所有的字段大写 如果与保留字冲突 加引号就好了

trailing nullcols 表示遇到空字段依然写入到数据库表中

Runtime.getRuntime().exec(

"cmd /c sqlplus bl/bl@egovdev_172.20.20.1 @sqlplus.txt");

 Runtime.getRuntime().exec(

        "cmd /c sqlldr blrkk/blrkk@oracle9i control=sqlldr.ctl direct=t

Trackback: http://tb.donews.net/TrackBack.aspx?PostId=337429


[点击此处收藏本文]  发表于2005年04月15日 7:30 PM




正在读取评论……
大名
网址
验证码
评论