2016-08-24 39 views
0

我正在使用FORALL语句来更新表中的很多寄存器,我需要做的是在更新“失败”时捕获异常,因为部门号XXX不存在。Oracle FORALL更新异常

FORALL x IN TABLE_DEPTO_DESCRIPTION.First .. TABLE_DEPTO_DESCRIPTION.Last SAVE EXCEPTIONS 
    UPDATE DEPARTMENTS SET 
     DESCRIPTION = TABLE_DEPTO_DESCRIPTION(x).DESCRIPTION 
    WHERE DPTO_NUMBER =TABLE_DEPTO_DESCRIPTION(x).id; 

回答

1

更新没有行的更新语句不是错误,所以没有发生异常。您可以在FORALL之后检查sql%bulk_rowcount收集以识别修改了0行数据的更新

FORALL ... 

FOR i IN 1 .. SQL%BULK_ROWCOUNT.count 
LOOP 
    IF(sql%bulk_rowcount(i) = 0) 
    THEN 
    -- TABLE_DEPTO_DESCRIPTION(i).id updated 0 rows. 
    -- Do something as a result 
    END IF; 
END LOOP;