NO_DATA_FOUND exception与FOR循环实现表记录存在性校验的最佳实践选择
两种实现方案的对比与最佳实践选择
优先选择第二种隐式循环方案,具体原因如下:
- 逻辑设计更合理:异常的设计初衷是处理程序运行时的非预期错误,「无匹配数据」在校验存在性的场景下是预期内的正常业务分支,用异常捕获来处理正常流程属于异常驱动的逻辑设计,可读性差,也不符合通用的编程规范。
- 代码更简洁:不需要额外定义接收查询结果的变量,减少了不必要的变量声明代码。
- 鲁棒性更强:第一种异常捕获方案如果出现匹配数据超过1条的情况,会抛出
too_many_rows未捕获异常,直接导致函数报错;而循环方案天然兼容多匹配的场景,只要存在符合条件的数据就会直接返回true,不会触发额外错误。 - 性能表现更稳定:如果你的业务场景中无匹配的情况出现频率较高,异常捕获的抛接开销会远高于普通的循环判断,循环方案的性能表现更稳定。
额外优化建议:两种方案都可以在查询语句中加上
and rownum = 1的限制,查到第一条符合条件的数据就终止检索,表数据量较大时能明显提升查询效率:for r in (select 'x' from my_table where id = v_id and rownum = 1)
内容的提问来源于stack exchange,提问作者Si7ius
相关产品推荐
相关产品推荐

