標籤:區別 100% 編寫 行儲存 功能 通過 實值型別 定義 輸入
定義:
預存程序(Stored Procedure )是一組為了完成特定功能的SQL 陳述式集,經編譯後儲存在資料庫中。使用者通過指定預存程序的名字並給出參數(如果該預存程序帶有參數)來執行它。預存程序是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程式都應該用到預存程序。 預存程序是由流量控制和SQL 陳述式書寫的過程,這個過程經編譯和最佳化後儲存在資料庫伺服器中,應用程式使用時只要調用即可。在Oracle 中,若干個有聯絡的過程可以組合在一起構成程式包。
優 點:
1.預存程序可以使得程式執行效率更高、安全性更好,因為過程建立之後 已經編譯並且儲存到資料庫,直接寫sql就需要先分析再執行因此過程效率更高,直接寫sql語句會帶來安全性問題,如:sql注入 。預存程序只在創造時進行編譯,以後每次執行預存程序都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用預存程序可提高資料庫執行速度。
2.建立過程不會很耗系統資源,因為過程只是在調用才執行。
3.預存程序可以用於降低網路流量,預存程序代碼直接儲存於資料庫中,所以不會產生大量T-sql語句的代碼流量。
4.使用預存程序使您能夠增強對執行計畫的重複使用,由此可以通過使用遠端程序呼叫 (RPC) 處理伺服器上的預存程序而提高效能。RPC 封裝參數和調用伺服器端過程的方式使引擎能夠輕鬆地找到匹配的執行計畫,並只需插入更新的參數值。
5.可維護性高,更新預存程序通常比更改、測試以及重新部署程式集需要較少的時間和精力。
6.代碼精簡一致,一個預存程序可以用於應用程式代碼的不同位置。
7.增強安全性:
a、通過向使用者授予對預存程序(而不是基於表)的存取權限,它們可以提供對特定資料的訪問;
b、提高代碼安全,防止 SQL注入(但未徹底解決,例如,將資料操作語言--DML,附加到輸入參數);
c、SqlParameter 類指定預存程序參數的資料類型,作為深層次防禦性策略的一部分,可以驗證使用者提供的實值型別(但也不是萬無一失,還是應該傳遞至資料庫前得到附加驗證)。
- 可以封裝資料邏輯和商務規則,以便使用者可以僅通過開發人員和資料庫管理員打算使用的方式訪問資料和對象。
- 驗證所有使用者輸入的參數化預存程序可用於阻止 SQL 插入式攻擊。 如果使用動態 SQL,請確保將命令參數化,並絕對不能將參數值直接包括在查詢字串中。
- 可禁止即席查詢和資料修改。 這樣將阻止使用者惡意或無意中損壞資料或執行查詢,以避免降低伺服器或網路的效能。
- 可以在過程代碼中處理錯誤,而無需將錯誤直接傳遞給用戶端應用程式。 這樣可防止返回錯誤訊息,以避免其可能有助於探測攻擊。 在伺服器上記錄錯誤並對其進行處理。
- 預存程序只能編寫一次,可由很多應用程式訪問。
- 用戶端應用程式不需要知道有關基礎資料結構的任何資訊。 只要更改不影響參數列表或返回的資料類型,就可以更改預存程序代碼,而無需在用戶端應用程式中變更。
- 預存程序可通過將多個操作組合到一個程序呼叫中來減少網路通訊。
- 安全性好—可以訪問執行預存程序而不必擁有直接操作基礎資料表的許可權
- 減少網路通訊流—預存程序可以包含多條SQL語句,但只要用一條語句來執行該預存程序,從而減少了用戶端應用程式對伺服器的調用次數和長度
- 快速執行—預存程序在第一次執行時進行語法檢查和編譯,編譯好的版本儲存在快取中,用於再次調用
- 保證一致性—如果使用者只通過預存程序修改資料,則可以消除偶然修改帶來的問題減少操作人員和編程人員的錯誤—由於傳遞資訊少,因此執行複雜任務更容易,不易出現SQL錯誤
借用SQL SERVER的預存程序來表達一下,理解一下概念就好,具體到Oracle請另行查詢
預存程序的運行如下:
首先運行CREATE PROC過程。這回解析查詢以確保會實際運行這些代碼。它與直接運行指令碼的區別在於CREATE PROC命令可以利用所謂的延遲名稱解析。延遲名稱解析可以忽略一些對象還不存在的事實。
在建立了預存程序後,它將等待第一次執行。在那時,預存程序被最佳化,而查詢計劃被編譯並且緩衝到系統上。後續幾次運行該預存程序時,除非通過使用WITH RECOMPILE選項指定,否則都會使用緩衝的查詢計劃而不是建立一個新的查詢計劃。這意味著每次使用該預存程序時,預存程序都會跳過很多最佳化和編譯工作。節省的確切時間取決於批處理的複雜性,批處理中表的大小,以及每個表上索引的數量。通常,節省的時間不是很多。但對於大多數情境來說可能是1秒或更少-但通過百分比可以計算出此區別(1秒比2秒快了100%)。當需要進行多次調用時或針對迴圈的情況,這一區別會變得更明顯。
預存程序與函數的對比
深入瞭解oracle預存程序的優缺點