Oracle SQL Loader不会在INSERT可以加载数据时加载数据(日期列,ORA-01858)

c9qzyr3d  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(168)

我有一张简单的table

  1. CREATE TABLE MYTABLE
  2. (
  3. MYDATE DATE,
  4. ID NUMBER
  5. )

MYDATE的默认格式为'dd-MON-yy'

使用匹配的日期格式插入工作没有任何问题

  1. INSERT INTO mytable values ('01-JAN-01',1)

以及SQL加载器

  1. LOAD DATA
  2. INFILE "mytable.dat" "str '#@n'"
  3. INTO TABLE mytable TRUNCATE
  4. FIELDS TERMINATED BY '&,#' TRAILING NULLCOLS
  5. (MYDATE ,ID)

.dat文件

  1. 01-JAN-01&,#1#@

当插入日期的日期格式不是默认的(我需要)时出现问题,然后我得到ORA-01861: literal does not match format string,因此我使用TO_DATE,它适用于INSERT

  1. INSERT INTO mytable values (TO_DATE('1901-02-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),2)

但由于某些原因,不适用于SQL Loader

.dat文件

  1. TO_DATE('1901-02-01 00:00:00','YYYY-MM-DD HH24:MI:SS')&,#2#@

日志文件

  1. SQL*Loader: Release 19.0.0.0.0 - Production on Fri Sep 16 13:32:33 2022
  2. Version 19.11.0.0.0
  3. Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
  4. Control File: mytable.ctl
  5. Data File: mytable.dat
  6. File processing option string: "str '#@
  7. '"
  8. Bad File: mytable.bad
  9. Discard File: none specified
  10. (Allow all discards)
  11. Number to load: ALL
  12. Number to skip: 0
  13. Errors allowed: 50
  14. Bind array: 250 rows, maximum of 1048576 bytes
  15. Continuation: none specified
  16. Path used: Conventional
  17. Table MYTABLE, loaded from every logical record.
  18. Insert option in effect for this table: TRUNCATE
  19. TRAILING NULLCOLS option in effect
  20. Column Name Position Len Term Encl Datatype
  21. ------------------------------ ---------- ----- ---- ---- ---------------------
  22. MYDATE FIRST * CHARACTER
  23. Terminator string : '&,#'
  24. ID NEXT * CHARACTER
  25. Terminator string : '&,#'
  26. Record 1: Rejected - Error on table MYTABLE, column MYDATE.
  27. ORA-01858: a non-numeric character was found where a numeric was expected
  28. Table MYTABLE:
  29. 0 Rows successfully loaded.
  30. 1 Row not loaded due to data errors.
  31. 0 Rows not loaded because all WHEN clauses were failed.
  32. 0 Rows not loaded because all fields were null.
  33. Space allocated for bind array: 129000 bytes(250 rows)
  34. Read buffer bytes: 1048576
  35. Total logical records skipped: 0
  36. Total logical records read: 1
  37. Total logical records rejected: 1
  38. Total logical records discarded: 0
  39. Run began on Fri Sep 16 13:32:33 2022
  40. Run ended on Fri Sep 16 13:32:33 2022
  41. Elapsed time was: 00:00:00.05
  42. CPU time was: 00:00:00.02

我不确定我是错过了这里的某些语法,还是SQL Loader的某些限制。

f0brbegy

f0brbegy1#

不要在CSV文件中设置“正确的”日期格式;SQL*Loader无法识别它。

文件的内容应为例如

  1. 1901-02-01 00:00:00&,#1#@

但是您需要将控制文件修改为

  1. LOAD DATA
  2. INFILE "mytable.dat" "str '#@n'"
  3. INTO TABLE mytable TRUNCATE
  4. FIELDS TERMINATED BY '&,#' TRAILING NULLCOLS
  5. (MYDATE "to_date(:mydate, 'yyyy-mm-dd hh24:mi:ss')", --> this
  6. ID)

相关问题