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
条目?
首先,将列称为from
和to
是一个坏主意,它们是关键字。像origin
和destination
这样的东西可能会更好......
其次,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
更改为小数,如果您查看日志文件,则所有内容都应该是一个字符,这意味着您正在执行隐式转换,可能无法保证。
为什么您收到特定的错误消息?我其实不知道。我也怀疑这是因为你有一个名为FROM
的专栏。根据控制文件文档,没有SQL*Loader关键字from
,所以我只能假设这是SQL*Loader与Oracle的通信存在一些问题。
这是另一个关于语法的好资源。