获取有关在Oracle

时间:2018-11-12 11:40:06

标签: sql oracle plsql

是否有任何方法可以获取引起问题的源行/表的完整行或选定的列

 "ORA-00001 unique constraint violated" error.

这是一个小例子。

create table DW_DATA (
                      file_id number,
                      process_date date,
                      record_info varchar2(50),
                      constraint uk_pd_ri unique (process_date, 
                                                  record_info)
);

创建后,插入第一条记录,

insert into DW_DATA
             values (100, 
                     '10-Jul-2018', 
                     'Information about row');

提交;

现在,我要插入新行。

insert into DW_DATA
             values (200, 
                    '10-Jul-2018', 
                    'Information about row');

它将引发错误“违反ORA-00001唯一约束”。

所以,我的问题是,是否可以使用DBMS_ERRLOG概念获取源行的file_id,即100。还是有其他方法可以获取有关源行的信息。

3 个答案:

答案 0 :(得分:0)

运行查询时,我得到:

  

ORA-00001:违反了唯一约束(FIDDLE_RSGKXYATHHTELGHIJXGD.UK_PD_RI)

其中包含唯一的约束名称-“ UK_PD_RI”。

然后您可以根据用于约束的列查找数据:

select *
from dw_data
where process_date = '10-Jul-2018' and record_info = 'Information about row';

诚然,这不是一个单一步骤。您可以使用错误日志记录直接进行更多操作。这涉及更多。 Here是阅读它的好地方。但是,我认为错误日志记录不会为唯一约束冲突提供现有行的rowid。

答案 1 :(得分:0)

select process_date, record_info, count(*) from DW_DATA 
group by process_date, record_info
having count(*) >1  

您将获得重复的英国值列表。

答案 2 :(得分:0)

您只需要使用MERGE语句:

MERGE INTO DW_DATA t1 
USING (
select 200 as file_id,
'10-Jul-2018' as process_date,
'Information about row' as record_info from dual 
) t2 
ON (t1.process_date= t2.process_date and t1.record_info = t2.record_info) 
WHEN MATCHED THEN UPDATE SET file_id = t2.file_id 
WHEN NOT MATCHED THEN INSERT (file_id, process_date,recorD_info ) VALUES (t2.file_id, t2.process_date, t2.recorD_info);

因为MERGE就是为此目的而设计的-存在时更新,不存在时插入。请查看该命令的文档。