使用不同的where子句重写多个几乎相同的查询

时间:2014-11-25 14:55:55

标签: oracle plsql

我有一组这样的查询:

variable a = select field1 from table where field2 = 1
variable b = select field1 from table where field2 = 2
variable c = select field1 from table where field2 = 3
variable d = select field1 from table where field2 = 4

稍后,完成了一些工作,并根据某些值使用这些变量,这样:

if aieou1 <> 0 then
CallProc(something, something else, something else, a)
end if

if aeiou2 <> 0 then
CallProc(something, something else, something else, b)
end if

if aieou3 <> 0 then
CallProc(something, something else, something else, c)
end if

if aeiou4 <> 0 then
CallProc(something, something else, something else, d)
end if

这对我来说似乎很可怕。在两个部分中有四个几乎相同的查询,这些查询只有很小的差异。有什么更好的方法来重写它?注意,如果它有所作为,&#34; table&#34;从前四个查询中只有大约12行(并且可能永远不会有更多)。

3 个答案:

答案 0 :(得分:1)

您应该只运行一个查询,然后循环查询结果以确定要执行的操作。例如类似的东西:

FOR r IN (
  select field1, field2 from table where field2 in (1,2,3,4)
) LOOP
  CASE r.field2
  WHEN 1 THEN a := r.field1;
  WHEN 2 THEN b := r.field1;
  WHEN 3 THEN c := r.field1;
  WHEN 4 THEN d := r.field1;
  END CASE;
END LOOP;

答案 1 :(得分:0)

您可以拥有绑定变量,并执行以下操作

variable a = select field1 from table where field2 =:bind_variable

然后,您可以将不同的值1,2,3,4传递给绑定变量

答案 2 :(得分:0)

您可以使用一个SELECT语句同时查询所有4行(类型从1到4)并通过游标读取它,而不是通过四个单独的查询分配到a,b,c和d内联。一旦你通过光标读取每一行,你就可以获得每种类型的值,并可能进行相应的调用(如果它还不太早)。

使用游标的另一个原因是它避免了上下文切换,这可能是相对昂贵的&#34;在具有大型SGA的非Windows主机上。