2012-03-22 91 views
1

我有一張表格,其中包含與我需要不斷更新的幾個時刻相關的數據。然而,爲了節省空間和時間,我表格中的每一行都是指給定的一天,而當天的每小時和每小時的數據分散在同一行的幾列中。因此,在更新特定時刻的數據時,我必須選擇通過PL/SQL過程和函數中的某些編程邏輯更新的列。Oracle PL/SQL:動態選擇更新/合併列表

是否有辦法動態選擇涉及更新/合併操作的列或列而不必每次重新組裝查詢字符串?性能是一個問題,吞吐量必須很高,所以我不能做任何表現不佳的事情。

編輯:我意識到規範化問題。不過,我仍然想知道選擇動態和編程更新/合併列的好方法。

+2

正如你在你的問題中指出的那樣,你沒有節省時間......你有沒有考慮正常化,你可以發表一些表格描述? – Ben 2012-03-22 21:39:25

+1

同意 - 這聽起來像一個規範化問題 - 獲得這種權利將使您的其他問題更容易 – Randy 2012-03-22 21:48:03

回答

3

動態選擇用於DML語句的列或列的唯一方法是使用動態SQL。使用動態SQL的唯一方法是生成一個可以準備並執行的SQL語句。當然,你可以用一種或多或少有效的方式來組裝字符串,你可以解析語句一次並多次執行,以便最大限度地減少使用動態SQL的開銷。但是,使用動態SQL來執行接近靜態SQL所需的操作需要相當多的工作。

我想回應Ben的觀點 - 通過這種方式構建你的桌子似乎並沒有節省時間。通過正確標準化表格,您可能會獲得更好的性能。我不確定你認爲自己節省了什麼空間,但是我會懷疑,如果在空間方面有任何問題,將表格結構反規範化將會爲你節省很多。

+0

我現在會嘗試這種方法,並考慮審查我的數據結構。如果我最終使桌子正常化並重新構建我的結構,我會讓你們知道我的行動方針是什麼。謝謝大家! – 2012-03-27 15:00:19

0

完成所需操作的一種方法是創建一個包含所有可能的更新(這不是很多,因爲我只會在給定時間更新一個字段)的包,然後選擇使用哪個查詢取決於我的內在邏輯。然而,這會導致一個大的if/else或switch/case-like語句。有更好的表現獲得類似結果的方法嗎?