往ORACLE数据库表里装载数据

 需求:今天客户发来一份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                        
 


 

你可能感兴趣的:(往ORACLE数据库表里装载数据)