Chinaunix

标题: sqlldr 问题 [打印本页]

作者: Gdla    时间: 2010-07-10 20:03
标题: sqlldr 问题
表的前三个字段导入时设值常量,后面的字段导入文本文件里面的数据,文本文件的值是以tab分隔的,

  1. SQL> desc t
  2. Name Type       Nullable Default Comments
  3. ---- ---------- -------- ------- --------
  4. A1   NUMBER(8)  Y                        
  5. A2   NUMBER(8)  Y                        
  6. A3   NUMBER(10) Y                        
  7. B1   NUMBER(10) Y                        
  8. B2   CHAR(10)   Y                  
复制代码
文本文件:

  1. 123        qwe
  2. 12345        asdf
  3. 678        asdf
复制代码
ctl文件:

  1. LOAD DATA  INFILE 'd:\Work\Tmp\sqlldr\dat\T.txt'  
  2. APPEND INTO TABLE EB_COLLECT.T  FIELDS TERMINATED BY X'09'  TRAILING NULLCOLS  
  3. (  A1 "TO_CHAR(SYSDATE,'YYYYMMDD')",
  4.    A2 RECNUM,
  5.    A3    constant 1001,
  6.    B1,
  7.    B2)

复制代码
其中文本文件的第一列123,12345,678想导入到B1,后面的导入到B2,前面的A1,A2,A3设常量,现在的写法导入的时候报错,请各位指出需要修改的地方,谢谢
作者: renxiao2003    时间: 2010-07-10 20:12
报什么错误。
作者: Gdla    时间: 2010-07-10 20:19
回复 2# renxiao2003


log文件


  1. SQL*Loader: Release 10.2.0.1.0 - Production on 星期六 7月 10 19:45:58 2010

  2. Copyright (c) 1982, 2005, Oracle.  All rights reserved.

  3. 控制文件:      d:\Work\Tmp\sqlldr\ctl\t.ctl
  4. 数据文件:      d:\Work\Tmp\sqlldr\dat\T.txt
  5.   错误文件:    d:\Work\Tmp\sqlldr\ctl\T.bad
  6.   废弃文件:    未作指定

  7. (可废弃所有记录)

  8. 要加载的数: ALL
  9. 要跳过的数: 0
  10. 允许的错误: 50
  11. 继续:    未作指定
  12. 所用路径:       直接

  13. 表 EB_COLLECT.T,已加载从每个逻辑记录
  14. 插入选项对此表 APPEND 生效
  15. TRAILING NULLCOLS 选项生效

  16.    列名                        位置      长度  中止 包装数据类型
  17. ------------------------------ ---------- ----- ---- ---- ---------------------
  18. A1                                  FIRST     *  WHT      CHARACTER            
  19.     列的 SQL 串: "TO_CHAR(SYSDATE,'YYYYMMDD')"
  20. A2                                                        RECNUM
  21. A3                                                        CONSTANT
  22.     Value is '1001'
  23. B1                                   NEXT     *  WHT      CHARACTER            
  24. B2                                   NEXT     *  WHT      CHARACTER            

  25. 记录 1: 被拒绝 - 表 EB_COLLECT.T 的列 B1 出现错误。
  26. ORA-01722: 无效数字

  27. 记录 2: 被拒绝 - 表 EB_COLLECT.T 的列 B1 出现错误。
  28. ORA-01722: 无效数字

  29. 记录 3: 被拒绝 - 表 EB_COLLECT.T 的列 B1 出现错误。
  30. ORA-01722: 无效数字


  31. 表 EB_COLLECT.T:
  32.   0 行 加载成功。
  33.   由于数据错误, 3 行 没有加载。
  34.   由于所有 WHEN 子句失败, 0 行 没有加载。
  35.   由于所有字段都为空的, 0 行 没有加载。

  36. 在直接路径中没有使用绑定数组大小。
  37. 列数组  行数:    3000
  38. 流缓冲区字节数:  256000
  39. 读取   缓冲区字节数: 5000000

  40. 跳过的逻辑记录总数:          0
  41. 读取的逻辑记录总数:             3
  42. 拒绝的逻辑记录总数:          3
  43. 废弃的逻辑记录总数:        0
  44. 由 SQL*Loader 主线程加载的流缓冲区总数:        2
  45. 由 SQL*Loader 加载线程加载的流缓冲区总数:        0

  46. 从 星期六 7月  10 19:45:58 2010 开始运行
  47. 在 星期六 7月  10 19:45:59 2010 处运行结束

  48. 经过时间为: 00: 00: 00.11
  49. CPU 时间为: 00: 00: 00.06

复制代码

作者: Gdla    时间: 2010-07-10 20:23
默认的值只能写在最后,前三个设默认值的字段放在后面就可以了
作者: renxiao2003    时间: 2010-07-10 20:49
回复 1# Gdla

控制文件如下:
  1. LOAD DATA INFILE 't.txt'
  2. APPEND INTO TABLE T FIELDS TERMINATED BY X'09' TRAILING NULLCOLS
  3. (B1,
  4. B2,
  5. A1 "TO_CHAR(SYSDATE,'YYYYMMDD')",
  6. A2 RECNUM,
  7. A3 constant 1001)
复制代码
从数据导入字段写在前面,默认(不是从文件导入)的字段要卸载后面。这样就OK了。
作者: renxiao2003    时间: 2010-07-10 20:50
本帖最后由 renxiao2003 于 2010-07-10 20:53 编辑

回复 1# Gdla
  1. SQL*Loader: Release 10.2.0.1.0 - Production on Sat Jul 10 20:46:42 2010

  2. Copyright (c) 1982, 2005, Oracle.  All rights reserved.

  3. Control File:   c.ctl
  4. Data File:      t.txt
  5.   Bad File:     t.bad
  6.   Discard File:  none specified

  7. (Allow all discards)

  8. Number to load: ALL
  9. Number to skip: 0
  10. Errors allowed: 50
  11. Bind array:     64 rows, maximum of 256000 bytes
  12. Continuation:    none specified
  13. Path used:      Conventional

  14. Table T, loaded from every logical record.
  15. Insert option in effect for this table: APPEND
  16. TRAILING NULLCOLS option in effect

  17.    Column Name                  Position   Len  Term Encl Datatype
  18. ------------------------------ ---------- ----- ---- ---- ---------------------
  19. B1                                  FIRST     *  WHT      CHARACTER
  20. B2                                   NEXT     *  WHT      CHARACTER
  21. A1                                   NEXT     *  WHT      CHARACTER
  22.     SQL string for column : "TO_CHAR(SYSDATE,'YYYYMMDD')"
  23. A2                                                        RECNUM
  24. A3                                                        CONSTANT
  25.     Value is '1001'


  26. Table T:
  27.   3 Rows successfully loaded.
  28.   0 Rows not loaded due to data errors.
  29.   0 Rows not loaded because all WHEN clauses were failed.
  30.   0 Rows not loaded because all fields were null.


  31. Space allocated for bind array:                  51328 bytes(64 rows)
  32. Read   buffer bytes: 1048576

  33. Total logical records skipped:          0
  34. Total logical records read:             3
  35. Total logical records rejected:         0
  36. Total logical records discarded:        0

  37. Run began on Sat Jul 10 20:46:42 2010
  38. Run ended on Sat Jul 10 20:46:47 2010

  39. Elapsed time was:     00:00:04.83
  40. CPU time was:         00:00:00.10
复制代码
上面是日志文件。
  3 Rows successfully loaded.
三行数据都导入了。
作者: Gdla    时间: 2010-07-10 22:43
谢谢你的回帖
作者: renxiao2003    时间: 2010-07-11 16:23
回帖是美德,关键还要帮助把问题解决了啊。
作者: duolanshizhe    时间: 2010-07-12 08:40
恩  默认值列应该写在最后的!
作者: renxiao2003    时间: 2010-07-12 08:47
恩  默认值列应该写在最后的!
duolanshizhe 发表于 2010-07-12 08:40



    但是一般来说不细看,可能不会注意这些细节(特别是刚开始使用的人)。
作者: dream_land    时间: 2010-07-12 12:15
恩,还从没用过默认值,原来是这样用的,又学习了!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2