web-dev-qa-db-ja.com

Oracle Sql Loaderを使用して、タイムスタンプフィールドに現在のタイムスタンプを入力する方法

SQLローダーを使用してパイプ区切りファイルを読み込んでおり、入力しているテーブルのLAST_UPDATEDフィールドにデータを入力したいと考えています。私の制御ファイルは次のようになります。

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
)

LAST_UPDATEDフィールドについて、SYSTIMESTAMPとCURRENT_TIMESTAMPを試しましたが、どちらも機能しませんでした。ただし、SYSDATEは問題なく機能しますが、時刻がわかりません。

私はSQLローダーを初めて使用するので、それが何であるか、または何ができないかについてはほとんど知りません。ありがとう。

14
Sen

以下を試しましたか?

CURRENT_TIMESTAMP [(精度)]

 select current_timestamp(3)from dual; 
 
 CURRENT_TIMESTAMP(3)
 ------------------ ----------- 
 10-JUL-04 19.11.12.686 +01:00 
 

SQLLDRでこれを行うには、CTLファイルでEXPRESSIONを使用して、SQLLDRが呼び出しをSQLとして処理できるようにする必要があります。

交換:

 LAST_UPDATED SYSTIMESTAMP 

と:

 LAST_UPDATED EXPRESSION "current_timestamp(3)" 
12
RC.

最終的に彼が私が求めているものに答えたので、RCの答えを受け入れましたが、Oracleのツールのいくつかに不慣れだったため、これを必要以上に難しくしました。

SQL * Loaderに日付だけでなくタイムスタンプを記録させようとしていました。 SYSDATEを使用し、テーブルで選択を行ったとき、日付(05-AUG-09)のみがリストされていました。

次に、RCの方法(コメント内)を試しましたが、うまくいきました。しかし、それでも、テーブルで選択を行ったとき、同じ日付形式を取得しました。次に、表示のために残りを切り捨てているだけの可能性がありました。それで私はしました:

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

そして、それはすべてを表示しました。次に、制御ファイルに戻ってSYSDATEに戻し、同じクエリを実行しました。確かに、HH:MI:SSはそこにあり、正確でした。

これはすべてSqlDeveloperで行われています。なぜこの動作がデフォルトになるのかわかりません。また、私を驚かせたのは、sqldeveloperの次の2つのステートメントです。

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

SELECT SYSDATE FROM DUAL; // returns only a date
3
Sen

SQL Developerで実行:ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'

そして、それをSELECT SYSDATE FROM DUALで確認します

0
vas