2014-11-25 61 views
0

我有疑问的是这样一个集合:重写多个几乎相同的查询与不同的where子句

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 

这对我来说似乎很可怕。四个几乎相同的查询,在这两个部分,只有轻微的差异。有什么更好的方法来重写这个?请注意,如果它有所不同,前四个查询中的“表”只有大约12行(并且可能永远不会有更多)。

+0

目前,我想我需要多个变量。我看到的唯一的“清理”至少是使用一个查询,并有案例陈述。但我希望我可以进一步清理它 – 2014-11-25 15:03:33

回答

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; 
0

你可以绑定变量,做像下面

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

然后,你可以通过1,2,3,4不同的价值取向,以绑定变量

0

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

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

相关问题