2012-03-24 3 views
0
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) 

файл данных:Oracle SQL не SQLLDR импорта корректно

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?

ответ

2

Во-первых, вызывающие столбцы 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. Согласно control file documentation, нет ключевого слова SQL * Loader from, поэтому я могу только утверждать, что это проблема с связью SQL * Loader с Oracle.

Адрес another good resource on syntax.

+0

Спасибо большое человек :) Я получил его работу! –

Смежные вопросы