Oracle执行删除语句遇ORA-01732错误,DB2可正常运行求协助
解决Oracle中ORA-01732删除视图报错的问题
这个问题我碰到过好多次,Oracle对可更新视图的限制确实比DB2严格不少,咱们来拆解原因并给出解决方案:
错误原因
你执行的删除语句里,子查询用到了ROW_NUMBER()分析函数,这种生成的视图属于不可更新视图——Oracle不允许直接对这类包含分析函数、聚合函数或者复杂逻辑的视图执行DML操作。而DB2在这类场景下的兼容性更宽松,所以能正常运行。
解决方案
下面两种方法都是直接操作原表,绕过不可更新视图的限制,推荐优先用第二种(更高效可靠):
方法1:关联DELETE(用ROWID精准匹配)
ROWID是Oracle表中每行的唯一标识符,用它关联能确保不会误删数据:
DELETE FROM FPM.FACT_PL_BS t WHERE t.ROWID IN ( SELECT rid FROM ( SELECT ROWID AS rid, ROW_NUMBER() OVER (PARTITION BY EMP_ID ORDER BY SAL DESC) AS RN FROM FPM.FACT_PL_BS WHERE MEASUREMENT_PERIOD_ID=20170811 AND SCENARIO_ID=1 ) a WHERE a.RN > 1 );
方法2:使用MERGE语句(Oracle推荐的批量操作方式)
MERGE语句在处理这类批量删除/更新时性能更优,逻辑也清晰:
MERGE INTO FPM.FACT_PL_BS t USING ( SELECT ROWID AS rid, ROW_NUMBER() OVER (PARTITION BY EMP_ID ORDER BY SAL DESC) AS RN FROM FPM.FACT_PL_BS WHERE MEASUREMENT_PERIOD_ID=20170811 AND SCENARIO_ID=1 ) a ON (t.ROWID = a.rid) WHEN MATCHED THEN DELETE WHERE a.RN > 1;
额外说明
如果你的表中EMP_ID+SAL是唯一组合,也可以用这两个字段关联原表,但用ROWID的方式始终是最精准、性能最好的,因为它直接定位到物理行。
内容的提问来源于stack exchange,提问作者Abhishek choudhary
相关产品推荐
相关产品推荐

