需求:今天客户发来一份xlsx格式的表格,需要在数据库里创建这张表,并且文档里的数据全部按照要求加载进这张表。
遇到装载数据的时候,大家都会想到用sqlldr。这个想法也很对。我们先看下表的结构。
对于oracle的关键字一般会有如:file、level、size、category、class、tpye等等;那么在创建表的时候就需要"LEVEL",
这样才能创建成功;
那么在处理这个工作的时候会遇到
“sqlldr userid=scott/scott@DB_JOYCE control='C:\Users\Administrator\AppData\Roaming\OraLoader\load_20130304110554.ctl' errors=50
log='C:\Users\Administrator\AppData\Roaming\OraLoader\load_20130304110554.log'
SQL*Loader: Release 11.2.0.3.0 - Production on 星期一 3月 4 11:05:55 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
控制文件: C:\Users\Administrator\AppData\Roaming\OraLoader\load_20130304110554.ctl
数据文件: C:\Users\Administrator\Desktop\wifi.txt
错误文件: C:\Users\Administrator\AppData\Roaming\OraLoader\load_20130304110554.bad
废弃文件: 未作指定
(可废弃所有记录)
要加载的数: ALL
要跳过的数: 0
允许的错误: 50
绑定数组: 64 行, 最大 256000 字节
继续: 未作指定
所用路径: 常规
表 S_WIFI,已加载从每个逻辑记录
插入选项对此表 APPEND 生效
TRAILING NULLCOLS 选项生效
列名 位置 长度 中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
ID FIRST * WHT CHARACTER
NULL if ID = 0X4e554c4c(字符 'NULL')
SSID NEXT * WHT CHARACTER
NULL if SSID = 0X4e554c4c(字符 'NULL')
SERVICE NEXT * WHT CHARACTER
NULL if SERVICE = 0X4e554c4c(字符 'NULL')
LABEL NEXT * WHT CHARACTER
NULL if LABEL = 0X4e554c4c(字符 'NULL')
NAME NEXT * WHT CHARACTER
NULL if NAME = 0X4e554c4c(字符 'NULL')
STATUS NEXT * WHT CHARACTER
NULL if STATUS = 0X4e554c4c(字符 'NULL')
TYPE NEXT * WHT CHARACTER
NULL if TYPE = 0X4e554c4c(字符 'NULL')
LEVEL NEXT * WHT CHARACTER
NULL if LEVEL = 0X4e554c4c(字符 'NULL')
ADDRESS NEXT * WHT CHARACTER
NULL if ADDRESS = 0X4e554c4c(字符 'NULL')
DISTRICT NEXT * WHT CHARACTER
NULL if DISTRICT = 0X4e554c4c(字符 'NULL')
APP NEXT * WHT CHARACTER
NULL if APP = 0X4e554c4c(字符 'NULL')
PROVINCE NEXT * WHT CHARACTER
NULL if PROVINCE = 0X4e554c4c(字符 'NULL')
NEAR NEXT * WHT CHARACTER
NULL if NEAR = 0X4e554c4c(字符 'NULL')
LNG NEXT * WHT CHARACTER
NULL if LNG = 0X4e554c4c(字符 'NULL')
LAT NEXT * WHT CHARACTER
NULL if LAT = 0X4e554c4c(字符 'NULL')
IP NEXT * WHT CHARACTER
NULL if IP = 0X4e554c4c(字符 'NULL')
FINISH_TIME NEXT * WHT CHARACTER
NULL if FINISH_TIME = 0X4e554c4c(字符 'NULL')
AREA NEXT * WHT CHARACTER
NULL if AREA = 0X4e554c4c(字符 'NULL')
AP NEXT * WHT CHARACTER
NULL if AP = 0X4e554c4c(字符 'NULL')
AP_TYPE NEXT * WHT CHARACTER
NULL if AP_TYPE = 0X4e554c4c(字符 'NULL')
AP_NUM NEXT * WHT CHARACTER
NULL if AP_NUM = 0X4e554c4c(字符 'NULL')
MONDAY NEXT * WHT CHARACTER
NULL if MONDAY = 0X4e554c4c(字符 'NULL')
TUESDAY NEXT * WHT CHARACTER
NULL if TUESDAY = 0X4e554c4c(字符 'NULL')
WEDNESDAY NEXT * WHT CHARACTER
NULL if WEDNESDAY = 0X4e554c4c(字符 'NULL')
THURSDAY NEXT * WHT CHARACTER
NULL if THURSDAY = 0X4e554c4c(字符 'NULL')
FRIDAY NEXT * WHT CHARACTER
NULL if FRIDAY = 0X4e554c4c(字符 'NULL')
SATURDAY NEXT * WHT CHARACTER
NULL if SATURDAY = 0X4e554c4c(字符 'NULL')
SUNDAY NEXT * WHT CHARACTER
NULL if SUNDAY = 0X4e554c4c(字符 'NULL')
ROWS 参数所用的值已从 64 更改为 35
记录 1: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 2: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 3: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 4: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 5: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 6: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 7: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 8: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 9: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 10: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 11: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 12: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 13: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 14: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 15: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 16: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 17: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 18: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 19: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 20: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 21: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 22: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 23: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 24: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 25: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 26: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 27: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 28: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 29: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 30: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 31: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 32: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 33: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 34: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 35: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 36: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 37: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 38: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 39: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 40: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 41: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 42: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 43: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 44: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 45: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 46: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 47: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 48: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 49: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 50: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
记录 51: 被拒绝 - 表 S_WIFI 的列 LEVEL 出现错误。
ORA-01747: user.table.column, table.column 或列说明无效
超过最大错误数 - 以上统计信息反映部分运行结果。
表 S_WIFI:
0 行 加载成功。
由于数据错误, 51 行 没有加载。
由于所有 WHEN 子句失败, 0 行 没有加载。
由于所有字段都为空的, 0 行 没有加载。
为绑定数组分配的空间: 252840 字节 (35 行)
读取 缓冲区字节数: 1048576
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 70
拒绝的逻辑记录总数: 51
废弃的逻辑记录总数: 0
从 星期一 3月 04 11:05:55 2013 开始运行
在 星期一 3月 04 11:05:56 2013 处运行结束
经过时间为: 00: 00: 00.90
CPU 时间为: 00: 00: 00.06
”
SQL> desc s_wifi
Name Type Nullable Default Comments
----------- ------------- -------- ------- --------
ID NUMBER
SSID VARCHAR2(100) Y
SERVICE VARCHAR2(200) Y
LABEL VARCHAR2(100) Y
NAME VARCHAR2(600) Y
STATUS VARCHAR2(200) Y
TYPE VARCHAR2(100) Y
LEVEL VARCHAR2(200) Y
ADDRESS VARCHAR2(600) Y
DISTRICT VARCHAR2(300) Y
CITY VARCHAR2(300) Y
PROVINCE VARCHAR2(300) Y
NEAR VARCHAR2(600) Y
LNG VARCHAR2(50) Y
LAT VARCHAR2(50) Y
IP VARCHAR2(100) Y
FINISH_TIME TIMESTAMP(9) Y
AREA VARCHAR2(500) Y
AP VARCHAR2(100) Y
AP_TYPE VARCHAR2(50) Y
AP_NUM NUMBER Y
MONDAY VARCHAR2(100) Y
TUESDAY VARCHAR2(100) Y
WEDNESDAY VARCHAR2(100) Y
THURSDAY VARCHAR2(100) Y
FRIDAY VARCHAR2(100) Y
SATURDAY VARCHAR2(100) Y
SUNDAY VARCHAR2(100) Y
“LEVEL” 这个单词顾名思义的和oracle关键字一样。这个时候数据在装载的时候会遇到报错。
这个时候如果按照一般的思路的话,会想到转换成sql然后运用UE去批量的替换。
(转换成sql的方法是:运用oraloader里的save to sql保存到sql_wifi里,同样Save to C:\Users\Administrator\Desktop\sql_wifi.sql
C:\Users\Administrator\Desktop\sql_wifi.sql saved, 44223594 bytes 这里是查看下保存sql转化日志。批量替换'level'为"LEVEL",这种方法也可以简单的说是
insert into SCOTT.S_WIFI
(ID,
SSID,
SERVICE,
LABEL,
NAME,
STATUS,
TYPE,
"LEVEL",
ADDRESS,
DISTRICT,
APP,
PROVINCE,
NEAR,
LNG,
LAT,
IP,
FINISH_TIME,
AREA,
AP,
AP_TYPE,
AP_NUM,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY)
values
('2',
'ChinaNet',
'中国电信',
'CT_ah_5540506302',
'淮南市科贸学校教学楼',
'在建热点',
'学校',
'全国普通高校',
'淮南市国庆东路53号',
'田家庵区',
'淮南市',
'安徽省',
'淮南市永安制药厂',
'117.04290°',
'32.65753°',
'10.211.200.11~10.211.200.11',
'2011-8-24',
'2F',
'室内分布',
'Fat',
'1',
'8:00~23:00',
'8:00~23:00',
'8:00~23:00',
'8:00~23:00',
'8:00~23:00',
'8:00~23:00',
'8:00~23:00');
跑单个的insert语句;如果数据量大的话那么会导致我们的工作进度很慢,如果遇到绑定变量的话也会让我们去按回车等。
这样的手动处理的方式很机械化,这个时候只需要简单的逆向思维下就OK了。所谓的逆向思维也就是我们所讲的另一种办法。)
这里的具体是关键字的问题;如果我们把关键字改成非oracle关键字的话那么去验证这个想法。
SQL> desc s_wifi
Name Type Nullable Default Comments
----------- ------------- -------- ------- --------
ID NUMBER
SSID VARCHAR2(100) Y
SERVICE VARCHAR2(200) Y
LABEL VARCHAR2(100) Y
NAME VARCHAR2(600) Y
STATUS VARCHAR2(200) Y
TYPE VARCHAR2(100) Y
FF VARCHAR2(200) Y
ADDRESS VARCHAR2(600) Y
DISTRICT VARCHAR2(300) Y
CITY VARCHAR2(300) Y
PROVINCE VARCHAR2(300) Y
NEAR VARCHAR2(600) Y
LNG VARCHAR2(50) Y
LAT VARCHAR2(50) Y
IP VARCHAR2(100) Y
FINISH_TIME TIMESTAMP(9) Y
AREA VARCHAR2(500) Y
AP VARCHAR2(100) Y
AP_TYPE VARCHAR2(50) Y
AP_NUM NUMBER Y
MONDAY VARCHAR2(100) Y
TUESDAY VARCHAR2(100) Y
WEDNESDAY VARCHAR2(100) Y
THURSDAY VARCHAR2(100) Y
FRIDAY VARCHAR2(100) Y
SATURDAY VARCHAR2(100) Y
SUNDAY VARCHAR2(100) Y
这个时候我们同样的用OraLoader去装载数据。--完成
SQL> select count(*) from s_wifi;
COUNT(*)
----------
78828
SQL> alter table s_wifi rename column FF to "LEVEL";
SQL> desc s_wifi
Name Type Nullable Default Comments
----------- ------------- -------- ------- --------
ID NUMBER
SSID VARCHAR2(100) Y
SERVICE VARCHAR2(200) Y
LABEL VARCHAR2(100) Y
NAME VARCHAR2(600) Y
STATUS VARCHAR2(200) Y
TYPE VARCHAR2(100) Y
FF VARCHAR2(200) Y
ADDRESS VARCHAR2(600) Y
DISTRICT VARCHAR2(300) Y
CITY VARCHAR2(300) Y
PROVINCE VARCHAR2(300) Y
NEAR VARCHAR2(600) Y
LNG VARCHAR2(50) Y
LAT VARCHAR2(50) Y
IP VARCHAR2(100) Y
FINISH_TIME TIMESTAMP(9) Y
AREA VARCHAR2(500) Y
AP VARCHAR2(100) Y
AP_TYPE VARCHAR2(50) Y
AP_NUM NUMBER Y
MONDAY VARCHAR2(100) Y
TUESDAY VARCHAR2(100) Y
WEDNESDAY VARCHAR2(100) Y
THURSDAY VARCHAR2(100) Y
FRIDAY VARCHAR2(100) Y
SATURDAY VARCHAR2(100) Y
SUNDAY VARCHAR2(100) Y
SQL> alter table s_wifi rename column FF to "LEVEL";
Table altered
SQL> commit;
Commit complete
SQL> desc s_wifi
Name Type Nullable Default Comments
----------- ------------- -------- ------- --------
ID NUMBER
SSID VARCHAR2(100) Y
SERVICE VARCHAR2(200) Y
LABEL VARCHAR2(100) Y
NAME VARCHAR2(600) Y
STATUS VARCHAR2(200) Y
TYPE VARCHAR2(100) Y
LEVEL VARCHAR2(200) Y
ADDRESS VARCHAR2(600) Y
DISTRICT VARCHAR2(300) Y
CITY VARCHAR2(300) Y
PROVINCE VARCHAR2(300) Y
NEAR VARCHAR2(600) Y
LNG VARCHAR2(50) Y
LAT VARCHAR2(50) Y
IP VARCHAR2(100) Y
FINISH_TIME TIMESTAMP(9) Y
AREA VARCHAR2(500) Y
AP VARCHAR2(100) Y
AP_TYPE VARCHAR2(50) Y
AP_NUM NUMBER Y
MONDAY VARCHAR2(100) Y
TUESDAY VARCHAR2(100) Y
WEDNESDAY VARCHAR2(100) Y
THURSDAY VARCHAR2(100) Y
FRIDAY VARCHAR2(100) Y
SATURDAY VARCHAR2(100) Y
SUNDAY VARCHAR2(100) Y