我在C:\oracle\product\10.2.0\oradata\orcl
中有一个控制文件loader.ctl。
loader.ctl文件的内容为
load data
infile 'd:\mydata\test.csv'
into table emp1
fields terminated by "," optionally enclosed by '"'
( empno, ename,job,mgr,hiredate,sal,comm,deptno )
emp1
表已存在于数据库中,test.csv中有9条记录
我从sqlldr执行了loader.ctl:
现在,当我检查我的数据库时,我发现emp1
中没有记录......为什么会这样?在提交之后,为什么表中没有填充数据?
答案 0 :(得分:8)
首先,您还没有指定日志文件,这意味着它可能与您的ctl文件位于同一位置,但它也可能位于您调用SQL * Loader的目录或数据目录中是 - 作为一个优点,从存储ctl文件的同一个地方调用SQL * Loader是个好主意,以避免混淆。去寻找它和相关的坏文件。
我总是会在命令行或ctl文件中明确说明日志的位置和错误 - 并在适当时丢弃文件。我更喜欢命令行,因此您可以将它们全部放在不同的文件夹中,这样它们就不会互相覆盖。因此,每次加载内容时都不必更改ctl文件,也可以将数据文件(以及其他几乎所有内容)放在命令行中。像这样:
call sqlldr scott/tiger@mydb my_ctl.ctl data=d:\20110201\my_file.csv log=d:\20110201\my_log.log bad=d:\20110201\my_bad.bad
您的问题有两个可能的原因。
正如@JustinCave建议您只是从错误的表格中选择。我们现在暂且不谈。
您已经注意到您已达到提交点,因此表格中应该有数据。事实并非如此。您已达到提交点,但是,根据您发布的ctl文件,您尚未指定允许的错误数。这意味着SQL * Loader使用默认值 - 50 。它可以到达一个提交点,在它之前加载的所有东西都是错误的;即你什么都不做。
第2点是导致问题的最可能原因。查看日志文件,它应该以一种不一定非常有用的方式告诉您,为什么您会遇到错误。坏文件包含尚未加载的所有数据,您可以根据日志进行检查。
第二个出现的原因有很多,所以这里列出了SQL * Loader可能出错的事项:
TRAILING NULLCOLS
。hiredate
,它将在ctl文件中变为hiredate "to_date(:hiredate,'yyyy/mm/dd')"
,其中yyyy/mm/dd
将更改为您需要的任何日期格式。有关好的列表,请参阅here。当然,您可以随时将此列更改为char并稍后处理转换。to_number
函数:sal "to_number(:sal,'999.99')"
。与日期一样,您可以随时将此列更改为char并稍后处理转换。deptno
更改为deptno terminated by whitespace
。sal integer external
,它明确地告诉SQL * Loader它是一个数字。.txt
到.exe
任何人?)characterset
选项。在我的头脑中,大部分可能出现的错误都是像你的一样简单。
现在的建议。的指定即可。它就这么简单。如果你不利用SQL * Loader极其强大的特性以及它提供的无数选项,你会遇到这样的问题。不仅当供应商改变某些事情而不告诉你你不太可能注意到这种变化时。
我还强烈建议始终在加载后检查日志文件。通常,这是检查您的加载是否成功的唯一方法之一。 SQL * Loader几乎在每个错误栏ORA-01653
上静默失败 - 没有足够的空间并将有关这些错误的所有信息放在日志文件中。除非你检查,否则你不会知道它们。
典型的ctl文件通常看起来像这样:
OPTIONS ( skip=1, errors=10, rows=10000, direct=True)
LOAD DATA
INFILE 'd:\mydata.csv'
TRUNCATE
INTO TABLE emp1
FIELDS TERMINATED BY ","
OPTIONALLY ENLCOSED BY '"'
TRAILING NULLCOLS
( empno
, ename
, job
, mgr
, hiredate "to_date(:hiredate,'dd/mm/yy')"
, sal integer external
, comm
, deptno terminated by whitespace
)
所有这些,禁止列名和表名是可选的。
我添加的是
skip
- 要跳过的顶部的行数。errors
- 停止前的最大错误数。rows
- 提交前要加载的行数。direct
- 使用直接路径加载。TRUNCATE
- 在加载TRAILING NULLCOLS
- 文件末尾有空列。"to_date(..."
- 指定加载此列时要调用的Oracle函数integer external
- 强制此列为数字数据类型。terminated by whitespace
- 删除行或列末尾的空格。加载更多。
以下是一些非常适合进一步阅读的链接,以及对所有可用选项的更多解释:
http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_params.htm
http://www.orafaq.com/wiki/SQL*Loader_FAQ
http://www.oracleutilities.com/OSUtil/sqlldr.html