添加DB时间戳到SQL加载程序CSV导入

问题描述:

我有一个客户谁是CSV文件不包含任何日期。他们想要一个时间戳来表明每一行何时加载到他们的Oracle 11g数据库中。 CSV文件由供应商提供,因此我无法修改该文件。我曾尝试添加默认列值和“插入后”触发器,但没有运气。 (性能不是问题,因为这是一个非工作时间的过程)。添加DB时间戳到SQL加载程序CSV导入

控制文件看起来是这样的:

options (skip=1, direct=true, rows=10000) 
load data 
infile data.dat 
badfile sqldatatxtdata.bad 
replace 
    into table LAM.CSV_DATA_TXT 
fields terminated by ',' 
trailing nullcols 
(ASSET, ASSET_CLASS, MATURITY, PRICE) 

表看起来像这样:

create table LAM.CSV_DATA_TXT (
ASSET VARCHAR2(20), 
ASSET_CLASS VARCHAR2(50), 
MATURITY varchar2(50), 
PRICE NUMBER(12,8), 
DATE_TIMESTAMP DATE default(SYSTIMESTAMP) 

任何其他的想法?谢谢。

+0

“但没有运气。”请详细说明你的意思。你有错误吗?负载是否失败?还是列留空?您给我们的细节越多,我们可以帮助您的可能性就越大。 – APC 2011-04-25 14:19:32

添加时间戳列与SYSTIMESTAMP的默认值应该工作:

SQL> create table t23 
    2 (id number not null 
    3  , ts timestamp default systimestamp not null) 
    4/

Table created. 

SQL> insert into t23 (id) values (9999) 
    2/

1 row created. 

SQL> select * from t23 
    2/

     ID TS 
---------- ------------------------- 
     9999 25-APR-11 15.21.01.495000 


SQL> 

因此,您需要更详细地解释了为什么它不工作你的情况。


我注意到在你的例子中你已经创建了列作为DATE数据类型。这将意味着它将截断默认的SYSTIMESTAMP到最接近的秒。如果你想要时间戳值,你需要使用TIMESTAMP数据类型。

+0

我其实已经想通了。这是一个提交问题。使用SQL Loader将csv文件加载到数据库时,需要设置direct = false。这将允许您在数据库中使用列默认值。如果它设置为true--它将不会填充。 – Lisa 2011-04-25 15:53:06