2009-08-05 7 views
14

Czytam plik rozdzielany potokami za pomocą programu SQL Loader i chcę wypełnić pole LAST_UPDATED w tabeli, którą zapełniłem. Moja Kontrola pliku wygląda następująco:Jak wypełnić pole znacznika z bieżącym znacznikiem czasu za pomocą programu Oracle Sql Loader

LOAD DATA 
INFILE SampleFile.dat 
REPLACE 
INTO TABLE contact 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
(
ID, 
FIRST_NAME, 
LAST_NAME, 
EMAIL, 
DEPARTMENT_ID, 
LAST_UPDATED SYSTIMESTAMP 
) 

Na polu LAST_UPDATED próbowałem SYSTIMESTAMP i CURRENT_TIMESTAMP i ani pracy. SYSDATE działa dobrze, ale nie daje mi czasu.

Jestem nowiutkim dla SQL Loader, więc naprawdę niewiele wiem o tym, co jest lub nie jest w stanie. Dzięki.

Odpowiedz

12

Czy próbowałeś następujące:

CURRENT_TIMESTAMP [(precyzja)]

 
select current_timestamp(3) from dual; 

CURRENT_TIMESTAMP(3) 
----------------------------- 
10-JUL-04 19.11.12.686 +01:00 

Aby to zrobić w SQLLDR, będzie trzeba użyć wyraz w pliku CTL tak że SQLLDR zna się traktować zadzwoń jako SQL.

Wymienić:

 
LAST_UPDATED SYSTIMESTAMP 

z:

 
LAST_UPDATED EXPRESSION "current_timestamp(3)" 
+0

Wciąż robi” tak to lubię. Daje mi ten błąd: SQL * Loader-350: Błąd składni w wierszu 17. Oczekiwano "," lub ")", znaleziono "CURRENT_TIMESTAMP". LAST_UPDATED CURRENT_TIMESTAMP (3) – Sen

+0

można spróbować zrobić: LAST_UPDATED wyrażenie "SELECT CURRENT_TIMESTAMP (3) z dual" LUB LAST_UPDATED wyrażenie "CURRENT_TIMESTAMP (3)" –

+0

Hehe, dobrze, że działa świetnie: LAST_UPDATED wyrażenie „CURRENT_TIMESTAMP (3) ", wybór z podwójnej opcji nie był z jakiegoś powodu. Okazuje się jednak, że SYSDATE działałby dobrze. Wyjaśnię w odpowiedzi. – Sen

3

przyjąłem odpowiedź RC, ponieważ ostatecznie odpowiedział co prosiłem, ale moja nieznajomość niektórych narzędzi Oracle doprowadziły mnie do tego trudniej niż to musiało być.

Próbowałem uzyskać SQL * Loader do zapisania znacznika czasu zamiast tylko daty. Kiedy użyłem SYSDATE, a następnie wybrałem opcję na stole, wyświetlano tylko datę (05-AUG-09).

Potem próbowałem metody RC (w komentarzach) i zadziałało. Jednak nadal, gdy wybrałem opcję na stole, otrzymałem ten sam format daty. Wtedy przyszło mi do głowy, że może po prostu skracać resztę w celach pokazowych. Tak więc zrobiłem:

select TO_CHAR(LAST_UPDATED,'MMDDYYYY:HH24:MI:SS') from contact; 

Następnie wyświetliło się wszystko. Potem wróciłem do pliku kontrolnego i zmieniłem go z powrotem na SYSDATE i uruchomiłem to samo zapytanie i na pewno HH: MI: SS było i było dokładne.

To wszystko dzieje się w SqlDeveloper. Nie wiem, dlaczego domyślnie to zachowanie. Co mnie zaskoczyło, to dwa stwierdzenia w sqldeveloper.

SELECT CURRENT_TIMESTAMP FROM DUAL; //returns a full date and time 

SELECT SYSDATE FROM DUAL; // returns only a date 
+4

SYSDATE zwraca typ danych DATE (ale obejmuje godziny, minuty i sekundy). CURRENT_TIMESTAMP zwraca typ danych TIMESTAMP, który sprowadza się do sekund ułamkowych (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.htm#i53219). Obie mają wewnętrzne reprezentacje (np. DATA ma 7 bajtów), a klient wybiera sposób wyświetlania. –

0

w SQL przebiegu programu: ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24: MI: SS'

a następnie sprawdzić jego zgodność z SELECT SYSDATE FROM DUAL

+0

To nie zadziała - nie zmienisz w ogóle daty i zmienisz sesję _different_. – Ben

Powiązane problemy