靜態SQL與動態SQL的比較

2021-09-08 16:56:12 字數 3063 閱讀 8296

靜態sql與動態sql相比具備很多優點,最主要的表現在兩個方面:

1、 靜態sql指定具體的物件,可以避免動態sql中隱含的錯誤

2、 靜態sql的分析和執行速度比動態sql要快

1、尋找消除動態sql的機會

一般而言,想採用動態sql實現的語句中都有不確定的因素,如果所有資訊都確定,沒有理由採用動態sql來實現,sql語句的不確定因素包括:sql選擇的字段列名不確定,選擇的from表名不確定,以及where條件中的條件欄位名不確定等情況,可採用decode, case,以及if else來分情況寫成靜態sql。

舉例: execute immediate

如果這個欄位的取值為有限的幾個值,則可以寫成以下靜態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

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!

靜態sql與動態sql相比具備很多優點,最主要的表現在兩個方面:

1、 靜態sql指定具體的物件,可以避免動態sql中隱含的錯誤

2、 靜態sql的分析和執行速度比動態sql要快

1、尋找消除動態sql的機會

一般而言,想採用動態sql實現的語句中都有不確定的因素,如果所有資訊都確定,沒有理由採用動態sql來實現,sql語句的不確定因素包括:sql選擇的字段列名不確定,選擇的from表名不確定,以及where條件中的條件欄位名不確定等情況,可採用decode, case,以及if else來分情況寫成靜態sql。

舉例: execute immediate

如果這個欄位的取值為有限的幾個值,則可以寫成以下靜態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

靜態SQL與動態SQL的比較

靜態sql與動態sql相比具備很多優點,最主要的表現在兩個方面 1 靜態sql指定具體的物件,可以避免動態sql中隱含的錯誤 2 靜態sql的分析和執行速度比動態sql要快 1 尋找消除動態sql的機會 一般而言,想採用動態sql實現的語句中都有不確定的因素,如果所有資訊都確定,沒有理由採用動態sq...

Oracle動態SQL和靜態SQL比較

oracle動態sql和靜態sql比較 1 靜態sqlsql與動態sql oracle編譯pl sql程式塊分為兩個種 其一為前期聯編 early binding 即sql語句在程式編譯期間就已經確定,大多數的編譯情況屬於這種型別 另外一種是後期聯編 late binding 即sql語句只有在執行...

動態sql 和靜態sql 下篇

動態sql 和靜態sql 下篇 1 批量繫結讓oracle 在對一組值進行sql操作時繫結乙個變數,這一組資料可以是任何的plsql的聚合型別 聯合陣列,內嵌表,可變陣列 集合元素必須是sql的資料型別,比如char date mumber。有三個句法支援動態批量繫結,execute immedia...