我有几个场景:
@H_502_8@
>需要以预定义的顺序从三个不同的表中读取列的值,并且只有一个表将具有该数据
>如果给出的标准存在记录,则从table1读取数据,否则从表2中读取给定标准的数据@H_502_8@
在Oracle存储过程中@H_502_8@
现在处理这些的方法是首先将给定查询的计数变为变量,如果计数>> 0,然后我们执行相同的查询来读取实际数据,如:@H_502_8@
@H_502_8@
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异常.@H_502_8@
目前我正在用游标重新实现这一点,所以我有这样的东西:@H_502_8@
@H_502_8@
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
我想从性能的角度找出哪一个更好 – 一个是Cursors,另一个是选择变量并且有三个no_data_found异常块.我不想使用我们目前的两阶段查询过程.@H_502_8@
解决方法
我不知道为什么你如此热衷于避免异常?出什么问题了:
@H_502_8@
@H_502_8@
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;
我相信这会比你的其他解决方案表现得更好,因为它尽可能少地完成所需的工作.@H_502_8@
请参阅How bad is ignoring Oracle DUP_VAL_ON_INDEX exception?,其中我演示使用异常比计数更好,以查看是否有任何数据.@H_502_8@