2009-08-05 28 views
14

Tôi đang đọc một tệp phân cách bằng đường ống với Trình tải SQL và muốn điền vào trường LAST_UPDATED trong bảng tôi đang điền. Tệp kiểm soát của tôi trông giống như sau:Cách điền vào một trường dấu thời gian với dấu thời gian hiện tại bằng cách sử dụng 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 
) 

Đối với trường LAST_UPDATED tôi đã thử SYSTIMESTAMP và CURRENT_TIMESTAMP và không hoạt động. SYSDATE tuy nhiên hoạt động tốt nhưng không cho tôi thời gian trong ngày.

Tôi là người mới sử dụng SQL Loader nên tôi thực sự biết rất ít về những gì nó có hoặc không có khả năng. Cảm ơn.

Trả lời

12

Bạn đã thử như sau:

CURRENT_TIMESTAMP [(chính xác)]

 
select current_timestamp(3) from dual; 

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

Để làm điều này trong sqlldr, bạn sẽ cần phải sử dụng EXPRESSION trong file CTL để sqlldr biết để xử lý gọi là SQL.

Thay thế:

 
LAST_UPDATED SYSTIMESTAMP 

với:

 
LAST_UPDATED EXPRESSION "current_timestamp(3)" 
+0

Tuy doesn' Tôi thích nó Cung cấp cho tôi lỗi này: SQL * Loader-350: Lỗi cú pháp ở dòng 17. Mong đợi "," hoặc ")", tìm thấy "CURRENT_TIMESTAMP". LAST_UPDATED CURRENT_TIMESTAMP (3) – Sen

+0

Bạn có thể thử thực hiện: EXPRESSION LAST_UPDATED "SELECT current_timestamp (3) từ kép" HOẶC EXPRESSION LAST_UPDATED "current_timestamp (3)" –

+0

Hehe, được rồi, mà các công trình lớn: EXPRESSION LAST_UPDATED "current_timestamp (3) ", lựa chọn từ tùy chọn kép không vì lý do nào. Tuy nhiên, hóa ra SYSDATE sẽ hoạt động tốt. Tôi sẽ giải thích trong một câu trả lời. – Sen

3

tôi chấp nhận câu trả lời RC vì cuối cùng anh đã trả lời tôi đang hỏi nhưng không quen thuộc của tôi với một số công cụ của Oracle dẫn tôi để làm điều này khó khăn hơn hơn là cần thiết.

Tôi đã cố gắng tải SQL * Loader để ghi lại dấu thời gian thay vì chỉ một ngày. Khi tôi sử dụng SYSDATE, và sau đó đã làm một lựa chọn trên bảng nó chỉ liệt kê ngày (05-AUG-09).

Sau đó, tôi đã thử phương pháp RC (trong nhận xét) và nó hoạt động. Tuy nhiên, vẫn còn, khi tôi đã làm một lựa chọn trên bàn tôi có cùng một định dạng ngày. Sau đó, nó xảy ra với tôi nó chỉ có thể cắt ngắn phần còn lại cho mục đích hiển thị. Vì vậy, sau đó tôi đã làm một:

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

Và sau đó hiển thị mọi thứ. Sau đó, tôi đã quay trở lại tập tin điều khiển và thay đổi nó trở lại SYSDATE và chạy cùng một truy vấn và chắc chắn đủ, HH: MI: SS đã ở đó và chính xác.

Đây là tất cả được thực hiện trong SqlDeveloper. Tôi không biết tại sao nó mặc định hành vi này. Ngoài ra những gì đã ném tôi ra là hai báo cáo sau đây trong sqldeveloper.

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

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

SYSDATE trả về kiểu dữ liệu DATE (nhưng bao gồm số phút và giây). CURRENT_TIMESTAMP trả về một loại dữ liệu TIMESTAMP mà đi xuống đến số giây phân số (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.htm#i53219). Cả hai đều có các biểu diễn bên trong (ví dụ: DATE được giữ là 7 byte) và máy khách chọn cách hiển thị chúng. –

0

Trong Sql Developer chạy: ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24: MI: SS'

và sau đó kiểm tra xem nó với CHỌN SYSDATE FROM DUAL

+0

Điều này sẽ không hoạt động - bạn không thay đổi ngày nào cả và bạn đang thay đổi phiên _different_. – Ben

Các vấn đề liên quan