14

我正在使用 SQL Loader 读取管道分隔文件,并希望在我正在填充的表中填充 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 Loader 的新手,所以我对它的功能知之甚少。谢谢。

4

4 回答 4

12

您是否尝试过以下方法:

CURRENT_TIMESTAMP [(精度)]

从对偶中选择 current_timestamp(3);

CURRENT_TIMESTAMP(3)
-----------------------------------------
04 年 7 月 10 日 19.11.12.686 +01:00

要在 SQLLDR 中执行此操作,您需要在 CTL 文件中使用 EXPRESSION,以便 SQLLDR 知道将调用视为 SQL。

代替:

LAST_UPDATED SYSTIMESTAMP

和:

LAST_UPDATED 表达式 "current_timestamp(3)"
于 2009-08-05T13:30:57.720 回答
3

我接受了 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 中的以下两条语句。

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

SELECT SYSDATE FROM DUAL; // returns only a date
于 2009-08-05T14:15:58.537 回答
0

如果要使用表定义的默认值,可以使用:

ROWDATE EXPRESSION "DEFAULT"
于 2021-05-03T12:44:22.543 回答
-1

在 Sql Developer 中运行:ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'

然后使用 SELECT SYSDATE FROM DUAL 检查它

于 2014-11-26T17:45:02.787 回答