2009-08-05 4 views
14

Je lis un fichier délimité par des conduites avec SQL Loader et je souhaite renseigner un champ LAST_UPDATED dans la table que je remplis. Mon fichier de contrôle ressemble à ceci:Comment remplir un champ d'horodatage avec l'horodatage actuel à l'aide d'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 
) 

Pour le champ LAST_UPDATED J'ai essayé SYSTIMESTAMP et CURRENT_TIMESTAMP ni travail. SYSDATE fonctionne cependant très bien mais ne me donne pas l'heure du jour.

Je suis tout nouveau à SQL Loader donc je ne sais pas vraiment de quoi il est ou n'est pas capable. Merci.

Répondre

12

Avez-vous essayé ce qui suit:

CURRENT_TIMESTAMP [(précision)]

 
select current_timestamp(3) from dual; 

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

Pour faire en sqlldr, vous aurez besoin d'utiliser des expressions dans le fichier CTL de sorte que sqlldr sait traiter les appeler comme SQL.

Remplacer:

 
LAST_UPDATED SYSTIMESTAMP 

avec:

 
LAST_UPDATED EXPRESSION "current_timestamp(3)" 
+0

encore n » J'aime ça. Donne-moi cette erreur: SQL * Loader-350: Erreur de syntaxe à la ligne 17. Attendant "," ou ")", trouvé "CURRENT_TIMESTAMP". LAST_UPDATED CURRENT_TIMESTAMP (3) – Sen

+0

Pouvez-vous essayer de faire: EXPRESSION LAST_UPDATED "SELECT current_timestamp (3) de double" OU EXPRESSION LAST_UPDATED "current_timestamp (3)" –

+0

Hehe, d'accord, qui fonctionne très bien: MANIFESTATION LAST_UPDATED « current_timestamp (3) ", la sélection de l'option double n'a pas pour une raison quelconque. Cependant, il s'avère que SYSDATE aurait bien fonctionné. Je vais expliquer dans une réponse. – Sen

3

J'ai accepté la réponse de RC parce que finalement il a répondu ce que je demandais, mais mon manque de familiarité avec certains outils d'Oracle m'a conduit à rendre plus difficile que ce qu'il devait être.

J'essayais d'obtenir SQL * Loader pour enregistrer un horodatage au lieu d'une simple date. Quand j'ai utilisé SYSDATE, et ensuite fait un select sur la table, il ne listait que la date (05-AUG-09).

Puis, j'ai essayé la méthode de RC (dans les commentaires) et cela a fonctionné. Cependant, quand j'ai fait un select sur la table, j'ai le même format de date. Ensuite, il m'est apparu qu'il pourrait juste être tronquer le reste à des fins d'affichage. Alors j'ai fait un:

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

Et il a ensuite tout affiché. Puis je suis retourné au fichier de contrôle et l'ai changé en SYSDATE et ai couru la même question et bien sûr, le HH: MI: SS était là et précis.

Tout cela se fait dans SqlDeveloper. Je ne sais pas pourquoi il est par défaut à ce comportement. Aussi ce qui m'a découragé sont les deux déclarations suivantes dans sqldeveloper.

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

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

SYSDATE renvoie un type de données DATE (mais qui inclut les heures, les minutes et les secondes). CURRENT_TIMESTAMP renvoie un type de données TIMESTAMP qui descend à quelques secondes (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.htm#i53219). Les deux ont des représentations internes (par exemple DATE est maintenu à 7 octets) et le client choisit comment les afficher. –

0

En Sql course Developer: ALTER SESSION SET NLS_DATE_FORMAT = 'AAAA-MM-JJ HH24: MI: SS'

puis vérifiez avec SELECT SYSDATE DE DOUBLE

+0

Cela ne fonctionnera pas - vous ne modifiez pas la date du tout et vous modifiez une session _different_. – Ben

Questions connexes