oracle 数据导入和导出
数据入库
- (直接用PLSQL)
1、建表
2、打开“工具”--点击“文本导入”
3、进入文本导入后,在“来自文本文件”侧加载文件
- 在“到Oracle”侧选择已经建好的表
点击右侧的字段,与你TXT文本相对应
- 点击下方“导入”完成数据入库
- 数据量大(用Oracle服务器)
对于数据量少于100万行的导入(select ... for update)和导出(select)最好用PLSQL查询,然后复制粘贴。
以下方式适合数据量较大(一般是多于100万行的数据)的导入导出,导入导出的数据是txt文本的格式。这种方式一般适合GB级别以及以下的数据文件,否则速度太慢。
数据的导入和导出都可以指定字符集。如果不指定字符集,导入(导出)完以后可以用iconv命令转码:
nohup iconv -f "gbk" -t "utf-8" wsd_201710_lyp.txt>wsd_201710.txt &
文件太大,邮件发不了的时候,可以用Linux上面的命令分割成多个文件:
split -l 1000000 /data02/five/five.txt -d -a 4 five.txt
1、准备(表已经建好)
--登录服务器
[[email protected] zhanglongkun]$ su - oracle
输入密码
[[email protected] ~]$ cd /data02/zhanglongkun/jiangxi2I_innet/
--编辑控制文件XXX.CTL
[[email protected] jiangxi2I_innet]$ cat upload.ctl
load data
characterset utf8 --中文字符集:ZHS16GBK
infile '/data02/jiangxi2I_innet/1701-1712.txt'
append into table TEMP_ZLK_JX2IINNET_IN
fields terminated by "," --分割符
TRAILING NULLCOLS
(CARDID, --表中对应的行
DEVICE_NUMBER)
2、入库
[[email protected]_innet]$ sqlldr ZBA_CZC/[email protected]=/data02/jiangxi2I_innet/upload.ctl log=/data02/jiangxi2I_innet/upload.log rows=1000000 direct=true skip_index_maintenance=TRUE
3、核查
--查看字体显示是否正确
select * from TEMP_ZLK_JX2IINNET_IN
--查看是否都导入
select count(*) from TEMP_ZLK_JX2IINNET_IN
[[email protected] jiangxi2I_innet]$ wc -l 1701-1712.txt
1885158 1701-1712.txt
数据出库
1、数据量小
直接在PLSQL中导出
2、数据量大
在服务器中编写.sh文件
#!/bin/sh
for prov_id in `cat prov_id.txt`
do
Sqluldr user=ZBA_C/[email protected]
field="||"
charset=ZHS16GBK
log=/bonc/bca/jc_fw/ljt/qrqm/yyyy_${prov_id}.log file=/bonc/bca/jc_fw/ljt/qrqm/yyyyy_${prov_id}.txt
query="SELECT DEVICE_NUMBER,CASE
and prov_id = '"${prov_id}"'--传参
"
Done
运行命令 nohup sh acpt.sh > 201802_.log &
不知道什么原因我提取的非常慢后来的做法是,不封装脚本直接在命令界面输入命令
sqluldr
user=ZBA_CZC/[email protected] --用户和密码
field="||" --分隔符(可以自己定义)
charset=ZHS16GBK --编码
log=/bonc/bca/jc_fw/ljt/qrqm/yyyyyy_all.log file=/bonc/bca/jc_fw/ljt/qrqm/yyyyy_all.txt 查询文件存放位置
query="SELECT * FROM TEMP_LJT_DN_NET_ALL " 查询语句
分隔符 \r=0x0d
\n=0x0a
|=0x7c
,=0x2c
\t=0x09
:=0x3a
#=0x23
"=0x22
'=0x27