我有几个场景:
1.需要以预定义的顺序从三个不同的表中读取列的值,并且只有一个表具有数据
1.如果存在给定条件的记录,则从表1读取数据,否则从表2读取给定条件的数据
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
我想从性能的Angular 找出哪一个更好--带Cursors的,还是对变量进行Select并有三个no_data_found Exception块的。我不想使用我们目前使用的两阶段查询过程。
6条答案
按热度按时间ljo96ir51#
我不知道你为什么如此热衷于避免例外?什么是错误的:
我相信这会比你的其他解决方案表现得更好,因为它做了最少的工作来达到预期的结果。
请参阅How bad is ignoring Oracle DUP_VAL_ON_INDEX exception?,其中我演示了使用异常比计数来查看是否有任何数据的性能更好。
9lowa7mx2#
不等同于
在多用户环境中。在第一种情况下,某人可以在您检查存在性和读取数据之间更新表。
就性能而言,我不知道哪个更好,但我知道第一个选项对sql引擎进行了两次上下文切换,而第二个选项只进行了一次上下文切换。
bpsygsoo3#
你现在处理第一种情况的方式不好。当一个查询就足够了的时候,你不仅要做两个查询,而且正如Erik指出的那样,它打开了两个查询之间数据更改的可能性(除非你使用只读或可序列化的事务)。
假设您说在这种情况下数据将正好位于三个表中的一个,那么下面这个怎么样?
另一个可以用来避免编写多个未找到数据的处理程序的“技巧”是:
但我真的看不出有什么理由比有三个异常处理程序更好。
对于第二种情况,我认为您的意思是两个表中可能都有数据,如果存在,您希望使用表1中的数据,否则使用表2中的数据。同样,您可以在单个查询中执行此操作:
at0kjp5o4#
“Dave Costa”的MIN选项的增强版本...
现在可以检查
v_rowcount
的值0,>1(大于1),其中正常的选择查询将抛出NO_DATA_FOUND
或TOO_MANY_ROWS
异常。值“1”将指示恰好存在一行,并将用于我们的目的。b09cbbtk5#
41zrol4v6#
使用“for row in cursor”形式的循环,如果没有数据,循环将不会处理: