1. 程式人生 > >數據庫中對存儲過程的理解

數據庫中對存儲過程的理解

上大 一個 技巧 庫服務器 靈活 困難 web erp 完整

1.存儲過程的概念

存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集。經編譯後存儲在數據庫中。

存儲過程是數據庫中的一個重要對象,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。

存儲過程是由 流控制 和 SQL語句書寫的過程,這個過程經編譯和優化後存儲在數據庫服務器中。

存儲過程 可由應用程序通過一個調用來執行,而且允許用戶聲明變量。

同時,存儲過程可以接收和輸出參數、返回執行存儲過程的狀態值,也可以嵌套調用。

2.存儲過程的優點


① 存儲過程的能力大大增強了SQL語言的功能和靈活性。

存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的 運算。

② 可保證數據的安全性和完整性。

理由1:通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而保證數據的安全。

理由2:通過存儲過程可以使相關的動作在一起發生,從而可以維護數據庫的完整性。

③ 在運行存儲過程前,數據庫已對其進行了語法和句法分析,並給出了優化執行方案。

這種已經編譯好的過程可極大地改善SQL語句的性能。

由於執行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執行。

④ 可以降低網絡的通信量。

理由:客戶端調用存儲過程只需要傳存儲過程名和相關參數即可,與傳輸SQL語句相比自然數據量少了很多。

⑤ 使體現企業規則的運算程序放入數據庫服務器中,以便:

1). 集中控制。

2). 當企業規則發生變化時在服務器中改變存儲過程即可,無須修改任何應用程序。

企業規則的特點是要經常變化,如果把體現企業規則的運算程序放入應用程序中,則當企業規則發生變化時,就需要修改應用程序工作量非常之大(修改、發行和安裝應用程序)。

如果把體現企業規則的運算放入存儲過程中,則當企業規則發生變化時,只要修改存儲過程就可以了,應用程序無須任何變化。

3.存儲過程的缺點

存儲過程將給服務器帶來額外的壓力。
  存儲過程多多時維護比較困難。
  移植性差,在升級到不同的數據庫時比較困難。

  調試麻煩,SQL語言的處理功能簡單。

4.存儲過程的種類


① 系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作。

② 本地存儲過程:用戶創建的存儲過程是由用戶創建並完成某一特定功能的存儲過程,事實上一般所說的存儲過程就是指本地存儲過程。

③ 臨時存儲過程:分為兩種存儲過程:

一是本地臨時存儲過程,以井字號(#)作為其名稱的第一個字符,則該存儲過程將成為一個存放在tempdb數據庫中的本地臨時存儲過程,且只有創建它的用戶才能執行它;

二是全局臨時存儲過程,以兩個井字號(##)號開始,則該存儲過程將成為一個存儲在tempdb數據庫中的全局臨時存儲過程,全局臨時存儲過程一旦創建,以後連接到服務器的任意用戶都可以執行它,而且不需要特定的權限。

④ 遠程存儲過程:在SQL Server2005中,遠程存儲過程(Remote Stored Procedures)是位於遠程服務器上的存儲過程,通常可以使用分布式查詢和EXECUTE命令執行一個遠程存儲過程。

⑤ 擴展存儲過程:擴展存儲過程(Extended Stored Procedures)是用戶可以使用外部程序語言編寫的存儲過程,而且擴展存儲過程的名稱通常以xp_開頭。

5.存儲過程的使用


傳統軟件行業大量使用存儲過程。

程序寫的數據邏輯效率不高,影響整體速度。在數據庫資源足夠的前提下,將壓力放在數據庫端是好選擇。充分利用商業數據庫龐大團隊對數據庫的各種優化。

比如ERP一類的軟件,用戶極少,但是業務復雜,數據量和數據復雜度極高,及時性和一致性要求極高。這種時候存儲過程就派上大用場了。

大多數的互聯網應用數據關系簡單,業務簡單。瓶頸一般在於數據庫的讀寫,這些在存儲過程話題中各位前輩已經描述的很清楚了。所以數據庫要盡快讀寫,這時候所有其他的都盡量放在web服務器上來做,更省成本。

存儲過程的困難在於對業務數據的理解和關系代數。寫錯了不好調試,技巧不足導致性能太差等等。

6.存儲過程的創建

創建存儲過程的語法如下:
CREATE PROC[EDURE] 存儲過程名
@參數1 [數據類型]=[默認值] [OUTPUT]
@參數2 [數據類型]=[默認值] [OUTPUT]
AS
SQL語句
EXEC 過程名[參數]


6.1

create procedure pro_student

as
select * from student;
--執行不帶參數的存儲過程
exec pro_student;
6.2

create proc proc_getStudentRecord

(
@sex varchar(2) out, --輸出參數
@age int output--輸入輸出參數
)
as
select * from student where ssex = @sex and sage = @age;

---------------------
作者:zmm198811
來源:CSDN
原文:https://blog.csdn.net/zmm198811/article/details/79966834
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

數據庫中對存儲過程的理解