Oracle Ref Cursor Vs Select into 异常处理
落叶无声
阅读:40
2024-02-27 23:08:18
评论:0
我有几个场景:
在 Oracle 存储过程中
现在处理这些的方式是首先将给定查询的计数放入变量中,如果计数 > 0,则我们执行相同的查询以读取实际数据,如下所示:
select count(*) from table1 into v_count
if v_count > 0
then
select data into v_data from table1
end if;
Return v_data
这样做是为了避免 no_data_found 异常,否则我将需要三个异常处理程序块来捕获每个表访问的 no_data_found 异常。
目前我正在用 Cursors 重新实现它,以便我有这样的东西:
cursor C1 is
select data from table1;
Open C1
Fetch C1 into v_data
if C1%FOUND
then
Close C1
Return v_data
End If
我想从性能的角度找出哪个更好 - 带有游标的一种,或者将 Select 放入变量并具有三个 no_data_found Exception 块的一种。我不想使用我们目前拥有的两阶段查询过程。
请您参考如下方法:
我不知道你为什么那么热衷于避免异常?出什么问题了:
begin
begin
select data into v_data from table1;
exception
when no_data_found then
begin
select data into v_data from table2;
exception
when no_data_found then
begin
select data into v_data from table3;
exception
when no_data_found then
v_data := null;
end;
end;
end;
return v_data;
end;
我相信这会比你的其他解决方案表现得更好,因为它做了尽可能少的工作来达到预期的结果。
见 How bad is ignoring Oracle DUP_VAL_ON_INDEX exception?我在这里演示了使用异常比计数来查看是否有任何数据的性能更好。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。