Oracle是否有类似Excel IFERROR的开箱即用查询错误处理函数
问题背景
在相关技术讨论中,@MTO 提供了一个用于定位查询中触发错误的行的自定义函数:
WITH FUNCTION test_from_wkbgeometry( v_data IN BLOB ) RETURN NUMBER IS temp SDO_GEOMETRY; BEGIN temp := sdo_util.from_wkbgeometry(v_data); RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN 0; END; SELECT * FROM my_table WHERE test_from_wkbgeometry( sdo_util.to_wkbgeometry( sdo_geometry(replace(sde.st_astext(shape),'LINESTRING M','LINESTRING')) ) ) = 0;
该自定义函数运行效果稳定:查询过程中若某行数据触发函数执行错误,该自定义函数就会标记对应问题行。
借助该方案可以快速定位问题行并排查故障原因,避免整个查询因单行数据问题直接报错终止。
咨询问题
虽然编写自定义函数可以满足上述错误捕获需求,但想了解Oracle是否提供了可实现同等功能的开箱即用(OOTB)函数?
举例来说,Excel中提供了通用的IFERROR()函数用于错误捕获,Oracle数据库中是否存在同类功能的原生函数?
解答
Oracle并没有在所有主流长期支持版本中提供和ExcelIFERROR()完全等价的通用全场景错误捕获原生函数,不同版本对应不同的官方实现方案:
- 12.2及以上版本
针对类型转换类场景,原生支持DEFAULT [返回值] ON CONVERSION ERROR语法,转换失败时直接返回指定默认值,不需要手动写异常捕获逻辑。比如把字符串转数字时遇到非法值要返回0,直接这么写就行:
同版本还带了SELECT TO_NUMBER('非法值' DEFAULT 0 ON CONVERSION ERROR) FROM DUAL;VALIDATE_CONVERSION()函数,可以直接判断字段值能不能正常完成指定类型转换,返回1代表值合法、0代表转换会报错,用来快速筛问题行很方便,不用自己写自定义函数。 - 12.1及以上版本
可以用原生LOG ERRORS子句,跑查询或者DML的时候,会自动把触发错误的行写到提前建好的错误日志表里,不会因为单行数据异常把整个语句打断,大数据量下批量排查问题行的效率比逐行调自定义函数高不少。 - 21c及以上版本
Oracle才正式上线了和Excel逻辑完全一致的原生IFERROR()函数,支持捕获任意表达式的执行错误,直接传待执行的表达式、出错时返回的默认值就行,不需要额外封装逻辑。
注意:如果用的是19c及更早的长期支持版本,碰到非类型转换类的自定义逻辑错误(比如这次案例里的SDO_GEOMETRY空间函数调用错误),没有通用的原生错误捕获函数能用,最稳妥、兼容性最好的方案还是用前文给出的那种包裹式自定义函数加异常捕获的写法。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

