目的:将windows下生成的1.xlsx文件导入oracle数据库中的ring表,表中有自增id列
一:先将1.xlsx转换成1.csv格式的excel文件,因为csv默认以逗号分隔列数据,而且使用双引号引起没列数据,很好,字符集不设置也可以正常导入汉字,呵呵,如果直接导入1.xlxs文件,而且设置相关编码,相关分隔符,都是乱码,经过测试,使用fields terminated by whitespace会出现乱码(可能是我字符集没设置好),使用fields terminated by X'09'会出现条数不对和乱码!
二:写控制文件:
vim aa.txt
options (errors=-1)
load data
characterset zhs16gbk --如果这里不写编码,那么汉字编码会占用比较多的字节,写了编码会占用比较少的字节数
infile '/tmp/1.csv'
replace into table ring
fields terminated by ',' optionally enclosed by '"' --如果excel一列中有的值中间有逗号,那么忽略这个逗号,将逗号也导入
trailing nullcols --这里为解决实际不存在id列而设置的
(
subject_id,
song char(300),
singer,
url char(500),
img_url char(500),
status,
the_order,
cp,
oid,
remark,
id "sqlldr_insert.nextval" --序列自动增加,实际excel中不存在这列,注意此列只能写在最后,不然会导入错误
)
三:导入本地数据库
$ sqlldr control=/tmp/aa.txt log=/tmp/aa.log
四:导入远程数据库也同样适用以上控制文件:
$ sqlldr username@t_remote control=/tmp/aa.txt log=/tmp/aa.log
注意:如果不按照上面的三个步骤做,或者第二步控制文件写的不一样,都会导致一些问题
20140120增加:使用CASE WHEN 语句设置入库的默认值
options (errors=-1)
load data
characterset utf8
infile '/data1/reload_dot_log/dot2.txt'
append into table dot_log2
fields terminated by '|'
trailing nullcols
(
qn "NVL(:qn ,'0')" ,
mac "CASE WHEN :mac IS NULL OR :mac='02:00:00:00:00:00' THEN '0' ELSE :mac END" ,
idfa "CASE WHEN :idfa IS NULL OR :idfa='00000000-0000-0000-0000-000000000000' THEN '0' ELSE :idfa END" ,
app "NVL(:app ,'0')" ,
visit_time DATE "yyyy-mm-dd hh24:mi:ss",
ip "NVL(:ip ,'0')" ,
id "dot_log_sequence.nextval"
)