oracle存储过程深入,深入了解oracle存储过程的优缺点
定義:
存儲過程(Stored Procedure )是一組為了完成特定功能的SQL 語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。存儲過程是數(shù)據(jù)庫中的一個重要對象,任何一個設(shè)計(jì)良好的數(shù)據(jù)庫應(yīng)用程序都應(yīng)該用到存儲過程。 存儲過程是由流控制和SQL 語句書寫的過程,這個過程經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,應(yīng)用程序使用時只要調(diào)用即可。在Oracle?中,若干個有聯(lián)系的過程可以組合在一起構(gòu)成程序包。
優(yōu) 點(diǎn):
1.存儲過程可以使得程序執(zhí)行效率更高、安全性更好,因?yàn)檫^程建立之后 已經(jīng)編譯并且儲存到數(shù)據(jù)庫,直接寫sql就需要先分析再執(zhí)行因此過程效率更高,直接寫sql語句會帶來安全性問題,如:sql注入 。存儲過程只在創(chuàng)造時進(jìn)行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。
2.建立過程不會很耗系統(tǒng)資源,因?yàn)檫^程只是在調(diào)用才執(zhí)行。
3.存儲過程可以用于降低網(wǎng)絡(luò)流量,存儲過程代碼直接存儲于數(shù)據(jù)庫中,所以不會產(chǎn)生大量T-sql語句的代碼流量。
4.使用存儲過程使您能夠增強(qiáng)對執(zhí)行計(jì)劃的重復(fù)使用,由此可以通過使用遠(yuǎn)程過程調(diào)用 (RPC) 處理服務(wù)器上的存儲過程而提高性能。RPC 封裝參數(shù)和調(diào)用服務(wù)器端過程的方式使引擎能夠輕松地找到匹配的執(zhí)行計(jì)劃,并只需插入更新的參數(shù)值。
5.可維護(hù)性高,更新存儲過程通常比更改、測試以及重新部署程序集需要較少的時間和精力。
6.代碼精簡一致,一個存儲過程可以用于應(yīng)用程序代碼的不同位置。
7.增強(qiáng)安全性:
a、通過向用戶授予對存儲過程(而不是基于表)的訪問權(quán)限,它們可以提供對特定數(shù)據(jù)的訪問;
b、提高代碼安全,防止 SQL注入(但未徹底解決,例如,將數(shù)據(jù)操作語言--DML,附加到輸入?yún)?shù));
c、SqlParameter 類指定存儲過程參數(shù)的數(shù)據(jù)類型,作為深層次防御性策略的一部分,可以驗(yàn)證用戶提供的值類型(但也不是萬無一失,還是應(yīng)該傳遞至數(shù)據(jù)庫前得到附加驗(yàn)證)。
可以封裝數(shù)據(jù)邏輯和業(yè)務(wù)規(guī)則,以便用戶可以僅通過開發(fā)人員和數(shù)據(jù)庫管理員打算使用的方式訪問數(shù)據(jù)和對象。
驗(yàn)證所有用戶輸入的參數(shù)化存儲過程可用于阻止 SQL 注入攻擊。 如果使用動態(tài) SQL,請確保將命令參數(shù)化,并絕對不能將參數(shù)值直接包括在查詢字符串中。
可禁止即席查詢和數(shù)據(jù)修改。 這樣將阻止用戶惡意或無意中損壞數(shù)據(jù)或執(zhí)行查詢,以避免降低服務(wù)器或網(wǎng)絡(luò)的性能。
可以在過程代碼中處理錯誤,而無需將錯誤直接傳遞給客戶端應(yīng)用程序。 這樣可防止返回錯誤消息,以避免其可能有助于探測攻擊。 在服務(wù)器上記錄錯誤并對其進(jìn)行處理。
存儲過程只能編寫一次,可由很多應(yīng)用程序訪問。
客戶端應(yīng)用程序不需要知道有關(guān)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的任何信息。 只要更改不影響參數(shù)列表或返回的數(shù)據(jù)類型,就可以更改存儲過程代碼,而無需在客戶端應(yīng)用程序中進(jìn)行更改。
存儲過程可通過將多個操作組合到一個過程調(diào)用中來減少網(wǎng)絡(luò)通訊。
安全性好—可以訪問執(zhí)行存儲過程而不必?fù)碛兄苯硬僮骰A(chǔ)表的權(quán)限
減少網(wǎng)絡(luò)通信流—存儲過程可以包含多條SQL語句,但只要用一條語句來執(zhí)行該存儲過程,從而減少了客戶端應(yīng)用程序?qū)Ψ?wù)器的調(diào)用次數(shù)和長度
快速執(zhí)行—存儲過程在第一次執(zhí)行時進(jìn)行語法檢查和編譯,編譯好的版本存儲在高速緩存中,用于再次調(diào)用
保證一致性—如果用戶只通過存儲過程修改數(shù)據(jù),則可以消除偶然修改帶來的問題減少操作人員和編程人員的錯誤—由于傳遞信息少,因此執(zhí)行復(fù)雜任務(wù)更容易,不易出現(xiàn)SQL錯誤
借用SQL SERVER的存儲過程示意圖來表達(dá)一下,理解一下概念就好,具體到Oracle請另行查詢
存儲過程的運(yùn)行示意圖如下:
首先運(yùn)行CREATE PROC過程。這回解析查詢以確保會實(shí)際運(yùn)行這些代碼。它與直接運(yùn)行腳本的區(qū)別在于CREATE PROC命令可以利用所謂的延遲名稱解析。延遲名稱解析可以忽略一些對象還不存在的事實(shí)。
在創(chuàng)建了存儲過程后,它將等待第一次執(zhí)行。在那時,存儲過程被優(yōu)化,而查詢計(jì)劃被編譯并且緩存到系統(tǒng)上。后續(xù)幾次運(yùn)行該存儲過程時,除非通過使用WITH RECOMPILE選項(xiàng)指定,否則都會使用緩存的查詢計(jì)劃而不是創(chuàng)建一個新的查詢計(jì)劃。這意味著每次使用該存儲過程時,存儲過程都會跳過很多優(yōu)化和編譯工作。節(jié)省的確切時間取決于批處理的復(fù)雜性,批處理中表的大小,以及每個表上索引的數(shù)量。通常,節(jié)省的時間不是很多。但對于大多數(shù)場景來說可能是1秒或更少-但通過百分比可以計(jì)算出此區(qū)別(1秒比2秒快了100%)。當(dāng)需要進(jìn)行多次調(diào)用時或針對循環(huán)的情況,這一區(qū)別會變得更明顯。
存儲過程與函數(shù)的對比
總結(jié)
以上是生活随笔為你收集整理的oracle存储过程深入,深入了解oracle存储过程的优缺点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle编程基本语法,oracle编
- 下一篇: c语言作业请输入一个运算符,C语言书面作