2017-08-03 64 views
0

哪種方法更好,爲什麼?在PL/SQL中選擇語句或函數?哪種方法更好,爲什麼?在PL/SQL中選擇語句或函數?

我遇到過一些關於PL/SQL的文章,提到select語句應該被函數替換。 這是否真的提高了性能?

+0

Select語句替換在哪裏?在應用程序代碼? – GurV

+0

是的,無論使用哪個選擇查詢,都可以調用一個函數。該函數執行該查詢並返回結果數據。這可能在函數,過程或包中。 – AdityaK

+0

可能是因爲SQL存儲在程序中,並且它的執行計劃被預先計算和緩存......對於直接SQL可能不會發生。 – GurV

回答

0

在編寫PL/SQL時,對select語句的每次調用都是上下文切換。上下文切換很昂貴,這就是爲什麼PL/SQL具有全部語句和其他結構,這些結構允許您在不調用SQL的情況下執行PL/SQL。當您從對象檢索數據時使用SQL,當您不需要從表中獲取時使用PL/SQL。
例如
使用

l_val := trim(l_val); 

而不是

select trim(l_val) into l_val from dual; 

都得到相同的答案,但是第一個比第二便宜得多。

最大限度地減少上下文切換將會使你的代碼更高效:
不好:

For eachrec in (select a, b from table1) loop 
    update table2 set c = eachrec.a where d = eachrec.b; 
end loop; 

更好:

update table2 set c = (select a from table1 where d = b) 
    where exists(select null from table1 where d = b); 

第二種方法比較好,因爲只有一個單一上下文切換,而比正在更新的每個記錄的上下文切換。

有人可以幫助我的更新聲明?我知道有一種不用做「選擇」就可以編寫它的方法。我們的數據庫來自不相信主鍵的供應商,所以我從來沒有養成在連接上使用更新的習慣。

+0

更好的方法是使用MERGE語句。 https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm –

0

通常,更喜歡SQL。 SQL可以跨數據庫移植。 Pl/SQL僅適用於Oracle,因此它不可移植。出於這個原因,我認爲存儲過程是技術債務。

+0

因此,你可能認爲在相同的光照下使用Oracle特定功能的SQL? – APC

相關問題