2009-08-05 6 views
14

Sto leggendo un file delimitato da pipe con SQL Loader e desidero compilare un campo LAST_UPDATED nella tabella che sto compilando. Il mio file di controllo si presenta così:Come compilare un campo data/ora con data/ora corrente utilizzando 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 
) 

Per il campo LAST_UPDATED ho provato SYSTIMESTAMP e CURRENT_TIMESTAMP e né lavoro. SYSDATE funziona comunque bene ma non mi dà l'ora del giorno.

Sono nuovo di zecca per SQL Loader, quindi so davvero molto poco di cosa è o non è capace. Grazie.

risposta

12

Hai provato la seguente:

CURRENT_TIMESTAMP [(precisione)]

 
select current_timestamp(3) from dual; 

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

Per fare questo in sqlldr, avrete bisogno per usare l'espressione nel file CTL in modo che sqlldr sa trattare la chiama come SQL.

Sostituire:

 
LAST_UPDATED SYSTIMESTAMP 

con:

 
LAST_UPDATED EXPRESSION "current_timestamp(3)" 
+0

Ancora doesn' mi piace Mi dà questo errore: SQL * Loader-350: Errore di sintassi alla riga 17. In attesa di "," o ")", trovato "CURRENT_TIMESTAMP". LAST_UPDATED CURRENT_TIMESTAMP (3) – Sen

+0

Puoi provare a fare: ESPRESSIONE LAST_UPDATED "SELECT CURRENT_TIMESTAMP (3) da duale" O LAST_UPDATED ESPRESSIONE "CURRENT_TIMESTAMP (3)" –

+0

Hehe, va bene, che le grandi opere: ESPRESSIONE LAST_UPDATED "CURRENT_TIMESTAMP (3) ", la selezione dalla doppia opzione non ha funzionato per qualche motivo. Tuttavia, risulta che SYSDATE avrebbe funzionato correttamente. Ti spiego in una risposta. – Sen

3

ho accettato la risposta di RC, perché in ultima analisi, ha risposto quello che mi è stato chiesto, ma la mia scarsa familiarità con alcuni degli strumenti di Oracle mi ha portato a fare questa più difficile di quanto doveva essere.

Stavo cercando di ottenere SQL * Loader per registrare un timestamp anziché solo una data. Quando ho usato SYSDATE, e poi ho fatto una selezione sul tavolo, era solo elencando la data (05-Aug-09).

Quindi, ho provato il metodo di RC (nei commenti) e ha funzionato. Tuttavia, ancora, quando ho fatto una selezione sul tavolo ho ottenuto lo stesso formato di data. Poi mi è venuto in mente che potrebbe troncare il resto per scopi di visualizzazione. Quindi ho fatto un:

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

E quindi visualizzato tutto. Poi sono tornato al file di controllo e l'ho cambiato in SYSDATE e ho eseguito la stessa query e abbastanza sicuro, l'HH: MI: SS era lì e preciso.

Tutto questo viene fatto in SqlDeveloper. Non so perché è impostato su questo comportamento. Inoltre, ciò che mi ha buttato fuori sono le seguenti due affermazioni in sqldeveloper.

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

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

SYSDATE restituisce un tipo di dati DATE (ma include ore minuti e secondi). CURRENT_TIMESTAMP restituisce un tipo di dati TIMESTAMP che scende a secondi frazionari (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.htm#i53219). Entrambe queste hanno rappresentazioni interne (es. DATE è tenuto come 7 byte) e il client sceglie come visualizzarle. –

0

in SQL Developer run: ALTER SESSION SET NLS_DATE_FORMAT = 'AAAA-MM-DD HH24: MI: SS'

e poi controllare con SELEZIONA SYSDATE FROM DUAL

+0

Questo non funzionerà - non stai cambiando affatto la data e stai modificando una sessione _different_. – Ben