oracle数据库,pl/sql工具,最近在用update语句批量更新时,发现更新报错,提示"违反唯一约束条件",如何找到更新出错的数据呢?此处做个记录:
update语句为: update wmwhse2.lotattribute t1 set t1.lottable02='MB1'
where t1.lot in (select lot from wmwhse2.lotattribute_kk0102 t1 where t1.lottable06='W003361');
为了找到更新出错的数据,执行如下sql,可以看到在pl/sql窗口中的output中输出更新报错的lot
DECLARE
NUMROWS INTEGER;
BEGIN
FOR CUR_1 IN (select lot
from wmwhse2.lotattribute_kk0102 t1
where t1.lottable06 = 'W003361') LOOP
BEGIN
NUMROWS := NUMROWS + 1;
update wmwhse2.lotattribute t1
set t1.lottable02 = 'MB1'
WHERE t1.lot = CUR_1.lot;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM || ' 更新失败lot:' || CUR_1.lot);
END;
IF NUMROWS > 1000 THEN
COMMIT;
NUMROWS := 0;
END IF;
END LOOP;
IF NUMROWS > 0 THEN
COMMIT;
END IF;
END;
当然,也可以通过新建存储存储过程来debug,查看执行过程:
CREATE OR REPLACE PROCEDURE TEST IS
BEGIN
DECLARE
NUMROWS INTEGER;
BEGIN
FOR CUR_1 IN (select lot
from wmwhse2.lotattribute_kk0102 t1
where t1.lottable06 = 'W003361') LOOP
BEGIN
NUMROWS := NUMROWS + 1;
update wmwhse2.lotattribute t1
set t1.lottable02 = 'MB1'
WHERE t1.lot = CUR_1.lot;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM || ' 更新失败lot:' || CUR_1.lot);
END;
IF NUMROWS > 1000 THEN
COMMIT;
NUMROWS := 0;
END IF;
END LOOP;
IF NUMROWS > 0 THEN
COMMIT;
END IF;
END;
END TEST;