我有一组这样的查询:
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行(并且可能永远不会有更多)。
答案 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主机上。