2009-08-05 46 views
14

Estoy leyendo un archivo delimitado por tubería con SQL Loader y quiero llenar un campo LAST_UPDATED en la tabla que estoy rellenando. Mi archivo de control es el siguiente:Cómo rellenar un campo de marca de tiempo con la marca de tiempo actual utilizando 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 
) 

Para el campo LAST_UPDATED He intentado SYSTIMESTAMP y CURRENT_TIMESTAMP y ni trabajo. Sin embargo, SYSDATE funciona bien, pero no me da la hora del día.

Soy nuevo en SQL Loader, así que realmente sé muy poco acerca de lo que es o no es capaz de hacer. Gracias.

Respuesta

12

¿Ha intentado el siguiente:

CURRENT_TIMESTAMP [(precisión)]

 
select current_timestamp(3) from dual; 

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

Para hacer esto en SQLLoader, usted tendrá que usar la expresión en el archivo CTL para que SQLLoader sabe para tratar la llamar como SQL.

Reemplazar:

 
LAST_UPDATED SYSTIMESTAMP 

con:

 
LAST_UPDATED EXPRESSION "current_timestamp(3)" 
+0

Aún doesn' me gusta Me da este error: SQL * Loader-350: error de sintaxis en la línea 17. Esperando "," o ")", se encontró "CURRENT_TIMESTAMP". LAST_UPDATED CURRENT_TIMESTAMP (3) – Sen

+0

Se puede intentar hacer: EXPRESIÓN LAST_UPDATED "SELECT current_timestamp (3) de la doble" O EXPRESIÓN LAST_UPDATED "current_timestamp (3)" –

+0

Jeje, bueno, que funciona muy bien: EXPRESIÓN LAST_UPDATED "current_timestamp (3) ", la opción de seleccionar de doble no por alguna razón. Sin embargo, resulta que SYSDATE habría funcionado bien. Voy a explicar en una respuesta. – Sen

3

acepté la respuesta de RC porque en última instancia, respondió lo que le pedía, pero mi falta de familiaridad con algunas de las herramientas de Oracle me llevó a hacer esto más difícil de lo que necesitaba ser

Estaba intentando que SQL * Loader grabe una marca de tiempo en lugar de solo una fecha. Cuando utilicé SYSDATE, y luego hice una selección en la tabla, solo estaba enumerando la fecha (05-AUG-09).

Luego, probé el método de RC (en los comentarios) y funcionó. Sin embargo, aún así, cuando hice una selección en la mesa obtuve el mismo formato de fecha. Entonces se me ocurrió que podría estar truncando el resto para propósitos de visualización. Entonces hice un:

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

Y luego mostró todo. Luego volví al archivo de control y lo cambié a SYSDATE y ejecuté la misma consulta, y efectivamente, el HH: MI: SS estaba allí y era preciso.

Todo esto se hace en SqlDeveloper. No sé por qué no funciona de esta manera. También lo que me sorprendió son las siguientes dos declaraciones en sqldeveloper.

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

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

SYSDATE devuelve un tipo de datos DATE (pero eso incluye horas, minutos y segundos). CURRENT_TIMESTAMP devuelve un tipo de datos TIMESTAMP que baja a fracciones de segundo (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.htm#i53219). Ambos tienen representaciones internas (por ejemplo, DATE se mantiene como 7 bytes) y el cliente elige cómo mostrarlos. –

0

En SQL Developer de ejecución: ALTER SESSION SET NLS_DATE_FORMAT = 'AAAA-MM-DD HH24: MI: SS'

y luego comprobarlo con SELECT SYSDATE FROM DUAL

+0

Esto no funcionará, no está cambiando la fecha y está alterando una sesión _different_. – Ben

Cuestiones relacionadas