2014-11-25 56 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主機可能「相對昂貴」。

相關問題