是否有任何方法可以获取引起问题的源行/表的完整行或选定的列
"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。还是有其他方法可以获取有关源行的信息。
答案 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就是为此目的而设计的-存在时更新,不存在时插入。请查看该命令的文档。