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

資料庫中對儲存過程的理解

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
版權宣告:本文為博主原創文章,轉載請附上博文連結!