Oracle SQL sqlldr无法正确导入

时间:2012-03-24 22:27:53

标签: sql oracle sql-loader

SQL> desc FLIGHTS;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 FLNO                                               NUMBER(38)
 FROM                                               VARCHAR2(64)
 TO                                                 VARCHAR2(64)
 DISTANCE                                           NUMBER(38)
 DEPARTS                                            DATE
 ARRIVES                                            DATE
 PRICE                                              FLOAT(63)

数据文件:

99,Los Angeles,Washington D.C.,2308,2005/04/12 09:30,2005/04/12 21:40,235.98
13,Los Angeles,Chicago,1749,2005/04/12 08:45,2005/04/12 20:45,220.98
346,Los Angeles,Dallas,1251,2005/04/12 11:50,2005/04/12 19:05,225.43
387,Los Angeles,Boston,2606,2005/04/12 07:03,2005/04/12 17:03,261.56

和sqlldr控制文件:

LOAD DATA INFILE 'flights.txt' 
 INTO TABLE Flights 
  FIELDS TERMINATED BY "," 
  ( FLNO
  , FROM
  , TO
  , DISTANCE
  , DEPARTS
  , ARRIVES
  , PRICE)

错误日志中的一个例外:

Table FLIGHTS, loaded from every logical record.
Insert option in effect for this table: INSERT

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
FLNO                                FIRST     *   ,       CHARACTER            
FROM                                 NEXT     *   ,       CHARACTER            
TO                                   NEXT     *   ,       CHARACTER            
DISTANCE                             NEXT     *   ,       CHARACTER            
DEPARTS                              NEXT     *   ,       CHARACTER            
ARRIVES                              NEXT     *   ,       CHARACTER            
PRICE                                NEXT     *   ,       CHARACTER            

Record 1: Rejected - Error on table FLIGHTS, column FROM.
ORA-01747: invalid user.table.column, table.column, or column specification

我不确定我的SQL有什么问题,但我认为这是因为FROM条目?

1 个答案:

答案 0 :(得分:2)

首先,调用列fromto是一个坏主意,它们是关键词。 origindestination之类的内容可能会更好......

其次,float,这确实不需要。你需要一个63位小数的价格的机会是遥远的。像number(18,2)这样的东西应该绰绰有余(实际上很荒谬),但如果你想要绝对最大值number(38,2)

我的最后一个预答案点是你的数据文件。如果可能的话,让供应商改变这一点。逗号分隔文件只是在寻找麻烦......逗号在数据中的方式太多了。如果您可以将其|¬分隔,那么它们就更好了,因为它们几乎没有在文本中使用过。

根据您的NLS_PARAMETERS,我们无法保证文件中的日期会更改为您在表格中所需的日期。最好在进入数据库时​​明确指定这个:

LOAD DATA 
 INFILE 'flights.txt' 
 INTO TABLE Flights 
  FIELDS TERMINATED BY "," 
  ( FLNO
  , FROM
  , TO
  , DISTANCE
  , DEPARTS "to_date(:departs,'yyyy/mm/dd hh24:mi')"
  , ARRIVES "to_date(:arrives,'yyyy/mm/dd hh24:mi')"
  , PRICE DECIMAL EXTERNAL
    )

请注意,我还将PRICE更改为小数,如果查看日志文件,一切都应该是一个字符,这意味着您正在进行隐式转换,这可能无法保证。< / p>

为什么您收到了特定的错误消息?我其实不知道。我也怀疑这是因为你有一个名为FROM的专栏。根据{{​​3}},没有SQL * Loader关键字from,所以我只能认为SQL * Loader与Oracle的通信存在一些问题。

这是control file documentation