靜態SQL與動態SQL的比較
靜態SQL與動態SQL相比具備很多優點,最主要的表現在兩個方面:
1、 靜態SQL指定具體的物件,可以避免動態SQL中隱含的錯誤
2、 靜態SQL的分析和執行速度比動態SQL要快
所以,如果使用靜態SQL可以達到目的,我們推薦用靜態SQL替代動態SQL,即使需要多編寫一些程式碼也是值得的。那麼,在開發程式程式碼的時候,如何判定一段SQL程式碼究竟該採用動態SQL,還是該採用靜態SQL呢?簡單總結以下幾個原則,供大家參考:
1、尋找消除動態SQL的機會
一般而言,想採用動態SQL實現的語句中都有不確定的因素,如果所有資訊都確定,沒有理由採用動態SQL來實現,SQL語句的不確定因素包括:SQL選擇的欄位列名不確定,選擇的From表名不確定,以及Where條件中的條件欄位名不確定等情況,可採用Decode, Case,以及IF ELSE來分情況寫成靜態SQL。
舉例:
Execute immediate
‘select ‘|| p_name||’ from app_main where eff_date>sysdate-1’ into v_value;
如果這個欄位的取值為有限的幾個值,則可以寫成以下靜態SQL:
Select decode(p_name,’ a’, a,
‘b’, b,
‘c’, c,
‘c_DATE’,to_char(c_DATE,’yyyymmdd’)) into v_value from tab_name;
2、在程式碼長短以及SQL語句的執行頻率上折中考慮
如果一段SQL程式碼的Where條件非常複雜,SQL語句本身也很長,甚至關聯到很多大表(這是我們經常遇到的情況),按照IF ELSE的方式寫成靜態SQL的話,整個程式的程式碼就會非常長,因此開發人員更偏向於使用動態SQL。在這種情況下,就需要考慮到程式碼的執行頻率,以及SQL語句在不同情況下的執行計劃,如果執行頻率較高,且各種情況執行計劃間的區別很大,則改寫成靜態SQL更加合理;對於寫成靜態SQL程式碼異常長的情況,我們可以將執行頻率高的主要SQL寫成靜態SQL,其他情況分類寫成動態SQL。這樣做,有利於我們按照不同的情況,固定執行計劃(前段時間發生過一個事件,在動態SQL中固定執行計劃,造成一種情況效率改善,另一種情況效率明顯降低)。
3、無法用靜態SQL或執行頻率較低的簡單SQL可採用動態SQL實現
有些情況下,沒有辦法確定SQL語句中欄位列名或者表名,也沒有辦法確定這些可變因素的個數,則只能採用動態SQL來實現。再就是一次性執行的指令碼,或者執行次數少的SQL也可以寫成動態SQL(能加上繫結變數更好),這時效能問題不大,程式程式碼也顯得簡潔。
舉例:
傳入引數是sequence的名字,按照這個名字獲取序列值,這時採用動態SQL可以靈活的執行語句,不必每增加一個seuence就增加一個語句。再就是要truncate table(根據傳入進來的table名字執行truncate,這個我們用的比較多)。
IF condition THEN
--code
ELSIF condition THEN
--code
else
--code
END IF;
CASE
WHEN condition1 THEN value1;
WHEN condition2 THEN value2;
WHEN condition3 THEN value3;
ELSE value4;
END CASE
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow