目前有个需求,就是定时从ftp上提取数据保存在一个ss.txt文件中,然后将内容导入数据库,我的数据库版本是oracle10g。
假设需要的导入数据库的内容如下:
张三,22,男,
李四,23,女,
王五,24,男,
赵六,25,女另创建一个input.ctl文件来将数据导入相应的表:
LOAD DATA
INFILE 'd:\ss.txt'
INSERT INTO TABLE CABINT.USERS
FIELDS TERMINATED BY ","
(name,
sex,
age) 打开运行,输入cmd,输入如下语句:
sqlldr userid=test/ych@orcl control =d:\input.ctl显示信息:
达到提交点-逻辑记录技术1请问为什么没有添加成功,这个信息不是添加成功的意思吗?我有哪步做错了?
假设需要的导入数据库的内容如下:
张三,22,男,
李四,23,女,
王五,24,男,
赵六,25,女另创建一个input.ctl文件来将数据导入相应的表:
LOAD DATA
INFILE 'd:\ss.txt'
INSERT INTO TABLE CABINT.USERS
FIELDS TERMINATED BY ","
(name,
sex,
age) 打开运行,输入cmd,输入如下语句:
sqlldr userid=test/ych@orcl control =d:\input.ctl显示信息:
达到提交点-逻辑记录技术1请问为什么没有添加成功,这个信息不是添加成功的意思吗?我有哪步做错了?
以表emp为例
首先编写一个控制命令的脚本文件,通常以ctl结尾,内容如下:
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
也可以将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
4.2 exp
参见dmp/exp_demo.sh。
将数据库内的各对象以二进制方式下载成dmp文件,方便数据迁移。
buffer:下载数据缓冲区,以字节为单位,缺省依赖操作系统
consistent:下载期间所涉及的数据保持read only,缺省为n
direct:使用直通方式 ,缺省为n
feeback:显示处理记录条数,缺省为0,即不显示
file:输出文件,缺省为expdat.dmp
filesize:输出文件大小,缺省为操作系统最大值
indexes:是否下载索引,缺省为n,这是指索引的定义而非数据,exp不下载索引数据
log:log文件,缺省为无,在标准输出显示
owner:指明下载的用户名
query:选择记录的一个子集
rows:是否下载表记录
tables:输出的表名列表
LOAD DATA
INFILE 'd:\ss.txt'
INSERT INTO TABLE CABINT.USERS
FIELDS TERMINATED BY "|"
(name char(20), //我数据库的字段设的是varchar2(20)
sex char(2),
age integer external) //我数据库的字段设的是number//执行cmd的那个命令以后,没有反应,请问我问题出在哪里到底?
是我少执行了什么命令吗
INFILE 'd:\ss.txt'
INSERT INTO TABLE CABINT.USERS
FIELDS TERMINATED BY "|" optionally enclosed by "
(name char(20), //我数据库的字段设的是varchar2(20)
sex char(2),
age integer external) //我数据库的字段设的是number这样试一试
张三,22,男|李四,23,女|王五,24,男|赵六,25,女fields terminated by ‘|’,光这个好像不够了把?