2009-08-05 9 views
14

Ich lese eine Pipe-getrennte Datei mit SQL Loader und möchte ein LAST_UPDATED-Feld in der Tabelle füllen, die ich bevölkere. Meine Steuerdatei sieht wie folgt aus:So füllen Sie ein Zeitstempelfeld mit dem aktuellen Zeitstempel mit 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 
) 

Für die LAST_UPDATED Feld I SYSTIMESTAMP und CURRENT_TIMESTAMP und weder Arbeit versucht haben. SYSDATE funktioniert jedoch gut, gibt mir aber keine Uhrzeit.

Ich bin brandneu in SQL Loader, daher weiß ich wirklich sehr wenig darüber, was es ist oder nicht kann. Vielen Dank.

Antwort

12

Haben Sie versucht, die folgenden:

CURRENT_TIMESTAMP [(precision)]

 
select current_timestamp(3) from dual; 

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

Um dies zu tun, in sqlldr, müssen Sie AUSDRUCK in der CTL-Datei verwenden, so dass sqlldr die zu behandeln weiß als SQL aufrufen.

ersetzen:

 
LAST_UPDATED SYSTIMESTAMP 

mit:

 
LAST_UPDATED EXPRESSION "current_timestamp(3)" 
+0

Noch doesn‘ Ich mag es. Gibt mir diesen Fehler: SQL * Loader-350: Syntax Fehler in Zeile 17. erwartet "," oder ")", gefunden "CURRENT_TIMESTAMP". LAST_UPDATED CURRENT_TIMESTAMP (3) – Sen

+0

Können Sie versuchen zu tun: LAST_UPDATED AUSDRUCK "SELECT current_timestamp (3) von dual" OR LAST_UPDATED AUSDRUCK "current_timestamp (3)" –

+0

Hehe, okay, das funktioniert gut: LAST_UPDATED AUSDRUCK „current_timestamp (3) ", die Auswahl aus Dual-Option nicht aus irgendeinem Grund. Es stellt sich jedoch heraus, dass SYSDATE gut funktioniert hätte. Ich werde es in einer Antwort erklären. – Sen

3

ich Antwort RCs akzeptiert, weil schließlich antwortete er, was ich fragen, aber meine Fremdheit mit einigen Tools von Oracle führte mich zu machen dies schwieriger als es sein musste.

Ich habe versucht, SQL * Loader einen Zeitstempel statt nur ein Datum aufzuzeichnen. Als ich SYSDATE benutzte und dann eine Auswahl auf der Tabelle vornahm, listete es nur das Datum auf (05-AUG-09).

Dann versuchte ich RC-Methode (in den Kommentaren) und es hat funktioniert. Trotzdem, als ich eine Auswahl auf dem Tisch machte, bekam ich das gleiche Datumsformat. Dann fiel mir auf, dass es nur den Rest für Anzeigezwecke abschneiden könnte. Also habe ich ein:

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

Und es dann alles angezeigt. Dann ging ich zurück zu der Kontrolldatei und änderte sie wieder in SYSDATE und führte dieselbe Abfrage aus und sicher genug, die HH: MI: SS war da und genau.

Dies wird alles in SqlDeveloper getan. Ich weiß nicht, warum es auf dieses Verhalten zurückgreift. Auch was mich abwarf, sind die folgenden zwei Anweisungen in sqldeveloper.

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

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

SYSDATE gibt einen DATE-Datentyp zurück (enthält jedoch Stunden in Minuten und Sekunden). CURRENT_TIMESTAMP gibt einen TIMESTAMP-Datentyp zurück, der in Sekundenbruchteile abfällt (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.htm#i53219). Beide haben interne Repräsentationen (zB DATE wird als 7 Bytes gehalten) und der Client wählt, wie sie angezeigt werden. –

0

In SQL Developer Lauf: ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24: MI: SS'

und es dann mit SELECT SYSDATE prüfen FROM DUAL

+0

Dies funktioniert nicht - Sie ändern das Datum überhaupt nicht und Sie ändern eine _different_ Sitzung. – Ben

Verwandte Themen