用SQLLDR来装载date类型的控制文件

以前给山东某单位做oracle数据库恢复得时候,恢复出来得数据中包含date类型,当时给客户提供得是sqlldr得方式,因为数据量比较大,用sqlldr装载起来速度比较快,所以采用了这种方式,结果在装载得时候也出现错误,吧解决方法贴出来,做个总结。
数据是这样得:
|111| |LF0003.lob| |03-JUN-2007 AD 00:00:00|
|222| |LF0004.lob| |01-JUN-2007 AD 00:00:00|
控制文件是这么写的:
load data
infile ‘dump001.dat‘
insert
into table "BTGL"."LOBDEMO"
("AA01"                             CHAR(3) enclosed by X‘7C‘       ,
 LOBFILE_COL1                       FILLER CHAR                     ,
 "AA02"                             LOBFILE(LOBFILE_COL1) TERMINATED BY EOF NULLIF LOBFILE_COL1 = ‘NONE‘,
 "AA03"                             DATE "DD-MON-YYYY AD HH24:MI:SS" enclosed by X‘7C‘)
结果提示错误:

SQL*Loader: Release 9.0.1.1.1 - Production on 星期四 6月 7 12:43:45 2007

(c) Copyright 2001 Oracle Corporation.  All rights reserved.

控制文件: dump001.ctl
数据文件: dump001.dat
错误文件: dump001.bad
废弃文件: 未作指定
:
(可废弃所有记录)

加载数: ALL
跳过数: 0
允许的错误: 50
绑定数组: 64 行,最大 256000 字节
继续:    未作指定
所用路径:       常规

表"BTGL"."LOBDEMO"
已加载从每个逻辑记录
插入选项对此表INSERT生效

列名                        位置      长度  中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
"AA01"                              FIRST     3         | CHARACTER           
LOBFILE_COL1                         NEXT     1           CHARACTER           
  (FILLER FIELD)
"AA02"                            DERIVED     *  EOF      CHARACTER           
    动态 LOBFILE。  文件名在字段 LOBFILE_COL1 中
    NULL if LOBFILE_COL1 =0X4e4f4e45(字符‘NONE‘)
"AA03"                               NEXT     *         | DATE DD-MON-YYYY AD HH24:MI:SS

记录 1: 被拒绝 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出现错误。
ORA-01858: 在要求输入数字处找到非数字字符

记录 2: 被拒绝 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出现错误。
ORA-01858: 在要求输入数字处找到非数字字符

记录 3: 被拒绝 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出现错误。
ORA-01858: 在要求输入数字处找到非数字字符

记录 4: 被拒绝 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出现错误。
ORA-01858: 在要求输入数字处找到非数字字符

表"BTGL"."LOBDEMO":
0 行加载成功
由于数据错误, 4 行没有加载。
由于所有 WHEN 子句失败, 0 行没有加载。
由于所有字段都为空的, 0 行没有加载。

为结合数组分配的空间:    17152字节(64行)
读取   缓冲区字节数: 1048576

跳过的逻辑记录总数:        0
读取的逻辑记录总数:        4
拒绝的逻辑记录总数:        4
废弃的逻辑记录总数:        0

从星期四 6月  07 12:43:45 2007开始运行
在星期四 6月  07 12:43:45 2007处运行结束

经过时间为: 00: 00: 00.15
CPU 时间为: 00: 00: 00.05

---------数据恢复 oracle数据库恢复专家 13352468096 QQ:9417901 网站:http://www.sosdb.com-----

是CTL文件写得有问题

修改ctl文件为:
load data
infile ‘dump001.dat‘
insert
into table "BTGL"."LOBDEMO"
 FIELDS TERMINATED BY " " OPTIONALLY ENCLOSED BY ‘|‘
TRAILING NULLCOLS
("AA01"                             CHAR(3)      ,
 LOBFILE_COL1                       FILLER CHAR                     ,
 "AA02"                             LOBFILE(LOBFILE_COL1) TERMINATED BY EOF NULLIF LOBFILE_COL1 = ‘NONE‘,
 "AA03"                             DATE "DD-MON-YYYY AD HH24:MI:SS"   )

然后运行,出现:

列名                        位置      长度  中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
"AA01"                              FIRST     3  WHT O (|) CHARACTER           
LOBFILE_COL1                         NEXT     *  WHT O (|) CHARACTER           
  (FILLER FIELD)
"AA02"                            DERIVED     *  EOF      CHARACTER           
    动态 LOBFILE。  文件名在字段 LOBFILE_COL1 中
    NULL if LOBFILE_COL1 =0X4e4f4e45(字符‘NONE‘)
"AA03"                               NEXT     *  WHT O (|) DATE DD-MON-YYYY AD HH24:MI:SS

记录 1: 被拒绝 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出现错误。
ORA-01843: 无效的月份

记录 2: 被拒绝 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出现错误。
ORA-01843: 无效的月份

记录 3: 被拒绝 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出现错误。
ORA-01843: 无效的月份

记录 4: 被拒绝 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出现错误。
ORA-01843: 无效的月份

表"BTGL"."LOBDEMO":
0 行加载成功
由于数据错误, 4 行没有加载。
由于所有 WHEN 子句失败, 0 行没有加载。
由于所有字段都为空的, 0 行没有加载。

---------数据恢复 oracle数据库恢复专家 13352468096 QQ:9417901 网站:http://www.sosdb.com-----

发现为DATE格式问题,然后设置nls_lang解决问题。
c:\>set nls_lang=amerIcan_america.zhs16gbk

c:\>sqlldr btgl/pass control=dump002.ctl direct=true

检查发现数据没问题。

问题解决

[align=right][color=#000066][此贴子已经被admin于2008-6-16 16:32:28编辑过][/color][/align]

---------数据恢复 oracle数据库恢复专家 13352468096 QQ:9417901 网站:http://www.sosdb.com-----
在sqlldr中使用数据库sequence的例子:
In the first example, all of the fields are
located in the datafile based on position, which makes this easier.
Another example below covers data that is comma delimited.

We want to load the data into the following table:
   SQL> CREATE TABLE load_db_seq_positional
     2  (seq_number NUMBER,
     3   data1 NUMBER,
     4   data2 CHAR(15) );

We will use the following sequence:
   SQL> CREATE SEQUENCE db_seq
     2    START WITH 1
     3    INCREMENT BY 1;

The control file would look like:
   LOAD DATA
   INFILE *
   INTO TABLE load_db_seq_positional
   (seq_number "db_seq.nextval",
    data1 POSITION(1:5),
    data2 POSITION(6:15),
   )
   BEGINDATA
   11111AAAAAAAAAA
   22222BBBBBBBBBB

After we run SQL*Loader, our table data looks like:
   SQL> SELECT * FROM load_db_seq_positional;
   SEQ_NUMBER      DATA1 DATA2
   ---------- ---------- ---------------
            1      11111 AAAAAAAAAA
            2      22222 BBBBBBBBBB
---------数据恢复 oracle数据库恢复专家 13352468096 QQ:9417901 网站:http://www.sosdb.com-----

http://www.sosdb.com/tech/oracle/77bbs1.htm

时间: 2024-10-10 08:56:05

用SQLLDR来装载date类型的控制文件的相关文章

[Oracle] SQL*Loader 详细使用教程(3)- 控制文件

控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置.数据的格式.以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件.   在控制文件里配置命令行参数 (OPTIONS) 在上一篇中我们讲过命令行参数可以配置在三个地方,其中一个就是可以使用控制文件的OPTIONS字句(这也是最常用的方式),如下所示: OPTIONS (DIRECT=true, SILENT=(ERRORS, FEEDBACK) ) 更多的命令行参数,请见上一篇.  

批量生成控制文件,用sqlldr自动导入多个表的数据

生成控制文件 准备工作: SQL>set colsep ' '; //-域输出分隔符SQL>set echo off; //显示start启动的脚本中的每个sql命令,缺省为onSQL> set echo on //设置运行命令是是否显示语句SQL> set feedback on; //设置显示"已选择XX行"SQL>set feedback off; //回显本次sql命令处理的记录条数,缺省为onSQL>set heading off; //输

由Action传到页面的Date类型也是一个Json数组,因此没法正常显示日期,解决办法如下

原贴请参考: http://blog.csdn.net/btt2013/article/details/50155949 添加一个工具类: JsonDateValueProcessor.java package com.xbmu.utils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import net.sf.json.JsonConfig; import net.sf.

计算两个日期之间相差几天(Date类型与String类型互相转换)

一:计算两个日期之间相差几天 1 /** 2 * 3 */ 4 package com.hlcui.date; 5 6 import java.text.ParseException; 7 import java.text.SimpleDateFormat; 8 import java.util.Calendar; 9 import java.util.Date; 10 11 import org.junit.Test; 12 13 /** 14 * @author Administrator

Java 日期时间 Date类型,long类型,String类型表现形式的转换 (转)

Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型java.util.Date dt = new Date();System.out.println(dt.toString());   //java.util.Date的含义long lSysTime1 = dt.getTime() / 1000;   //得到秒数,Date类型的getTime()返回毫秒数 2.由long类型转换成Date类型SimpleDat

Oracle数据库以date类型保存日期时,Java中用哪个类对应数据库的date类型?

1. 使用JDBC操作Oracle数据库时,使用java.sql.Date类型对应数据库的date类型,此时只能保存和读取日期部分, 时间(时分秒)部分不能读取和保存:  查询结果集可以直接获取Date类型的数据:java.sql.Date date=resultSet.getDate("dateTime"): java.sql.Date类型的数据也可以直接保存到数据库或者与数据库中date类型的数据直接比较大小: 字符串的日期,则用SQL语句的转换函数 to_date('2017-4

【Spring】SpringMVC中浅析Date类型数据的传递

在控制器中加入如下代码: @InitBinder public void initBinder(ServletRequestDataBinder bin){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置自己的date格式 CustomDateEditor cust = new CustomDateEditor(dsf,true); bin.registerCustomEditor(Date

Date类型常用概念及方法总结(1)

Date类型使用UTC(国际协调时间)1970年1月1日零时开始经过的毫秒数来保存时间. (1)创建当前日期 调用Date不传递参数的情况下,创建的新对象自动获得当前日期和时间(本地时区). var now=new Date(); (2)创建特定的日期和时间 如果要创建特定的日期对象,必须传入表示该日期的毫秒数(即从UTC时间1970年1月1日至该日期的毫秒数).为简化这一过程,ECMAScript提供了两个方法:Date.parse()和Date.UTC(): var time1=new Da

那些年一起踩过的坑 — Date类型序列化的问题

坑在哪里? 序列化 和 反序列化 的时候对Date字段的格式设置不一致 例如:将Java bean序列化成Json string的时候 格式为 yyyy-MM-dd 解析的时候格式为 yyyy-MM-dd hh:mm:ss, 则会抛解析异常 说白了就是把一个字符串转换成Date类型,但格式不匹配,当然是会转换失败的 为什么会被坑? 系统间交互,对Date类型数据进行格式化,便于... 交互双方对时间格式定义不一致,没有事先约定好... 怎么能不被坑? 要么双方约定时间格式 要么不要格式化数据,直