Oracle DML错误记录字段类型

时间:2015-08-18 10:36:32

标签: database oracle logging dml

我想问一下Oracle中的DML错误记录 我有一个具有这种结构的原始表

table_test(
ID Int PK,
test_time date
)

我还为此创建了一个错误记录表 ERR $ _table_test

据我所知,ID'中的字段“test_time'和”ERR$_table_testVARCHAR(4000)

让我举个例子

1. Insert into table_test values (1,to_date('18/08/2015 15:00:00' , 'dd/mm/yyyy hh24:mi:ss')) 

==>成功,插入1行

2. Insert into table_test values (1,to_date('18/08/2015 15:00:00' , 'dd/mm/yyyy hh24:mi:ss'))

==>在table_test中插入0行,在ERR $ _table_test中插入1行,并显示以下错误:ORA-00001:违反了唯一约束

3. select * from ERR$_table_test

找到1条记录:但是字段test_time是'18 / 08/2015'没有时间< ==我想要这个字段的全时戳?

之后,我尝试改变表ERR $ _table_test

alter table ERR$_table_test modify test_time date

我正好重做上面的例子

这次我在ERR $ _table_test

中获得了test_time的完整时间戳

但是,我试试

Insert into table_test values (2,to_date('abc xyz' , 'dd/mm/yyyy hh24:mi:ss'))

==>在ERR $ _table_test

中插入错误类型时发生SQL错误

这是我关心的事情

  1. 我可以在ERR $ _table_test中获取完整时间戳而不更改其列类型吗?

  2. 如果我必须将列类型更改为DATE,当时间格式错误时,我是否仍会收到第二种情况的错误日志?

  3. 感谢您的支持,

1 个答案:

答案 0 :(得分:2)

如果它可以评估日期,那么它会将其转换回字符串,以使用您的会话设置放入varchar2(4000)列。由于它是一个日期字段,您可以通过在执行插入之前设置NLS_DATE_FORMAT来控制它:

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

Insert into table_test values (1,to_date('18/08/2015 15:00:00' , 'dd/mm/yyyy hh24:mi:ss')) log errors into err$_table_test;

Insert into table_test values (1,to_date('18/08/2015 15:00:00' , 'dd/mm/yyyy hh24:mi:ss')) log errors into err$_table_test;

Insert into table_test values (2,to_date('abc xyz' , 'dd/mm/yyyy hh24:mi:ss')) log errors into err$_table_test;

column id format a10
column test_time format a20
select ora_err_number$, id, test_time from ERR$_table_test;

                        ORA_ERR_NUMBER$ ID         TEST_TIME          
--------------------------------------- ---------- --------------------
                                      1 1          2015-08-18 15:00:00 
                                   1858 2          abc xyz        

哪个不理想,特别是如果您可能从多个客户端插入,您无法控制其设置。

但正如the documentation所述,如果您在错误记录表中使用日期数据类型而不是建议的(如果通过DBMS_ERRLOG varchar2(4000)创建,则使用日期数据类型),转换失败 - 与您的abc xyz值一样 - 将导致整个语句失败:

  

由于类型转换错误是可能发生的一种错误,因此错误日志记录表中可选列的数据类型必须是可以捕获任何值而不会丢失数据或转换错误的类型。 (如果可选的日志列与DML表列的类型相同,则将有问题的数据捕获到日志中可能会遇到导致错误的相同数据转换问题。)数据库尽最大努力为数据记录有意义的值这会导致转换错误。如果无法导出值,则会为该列记录NULL。插入错误记录表时出错导致语句终止。

所以回答你的第二个问题,不;如果您将错误日志数据类型更改为DATE,那么您将无法记录无效日期/时间格式的错误,该语句将终止。