SQL研習錄(33)——存儲過程詳解


版權聲明

  • 本文原創作者:清風不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、儲存過程

1、基本知識

  (1)什麼是存儲過程?
  存儲過程就相當於Java中的函數,把一堆代碼封裝起來實現模塊化調用,它由存儲過程名及存儲過程參數組成,可以有返回結果,並且我們前面學習的IF…ELSE、WHILE和INSERT、SELECT等都可以在存儲過程裏使用
  (2)存儲過程的優點
  執行速度更快——存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需要再重新編譯,而一般的SQL語句沒執行一次就編譯一次,所以使用存儲過程可提高數據庫的執行速度
  允許模塊化設計程序——就像Java中方法的複用一樣
  提高系統安全性——參數化的存儲過程可以防止SQL注入式攻擊
  減少網絡流量——存儲過程位於服務器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網絡傳輸的數據量
  (3)存儲過程的缺點
  如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨着用戶數量的增多,所有的壓力都會由服務器來承擔,而用戶需求的增加會導致數據結構的變化,接着就是系統相關的問題了,最後如果用戶想維護該系統就會很難很難,而且代價相當大

2、系統存儲過程與自定義存儲過程

(1)系統存儲過程

  一般情況下以sp或xp開頭的爲系統存儲過程,
  以SQL Server數據庫爲例,列出它的一些系統存儲過程如下:

-- 列出當前實例上所有的數據庫的基本信息
sp_databases;
-- 報告有關指定數據庫或所有數據庫的信息
sp_helpdb [ [ @dbname= ] 'name' ] 
-- 更改數據庫的名稱
sp_renamedb [ @dbname = ] 'old_name' , [ @newname = ] 'new_name'
-- 返回當前環境下可查詢的對象的列表(當前數據庫下所有的表)
sp_tables
-- 返回某個表列的信息
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ] 
-- 查看某個表的所有信息
sp_help [ [ @objname = ] 'name' ] 
-- 查看某個表的約束
sp_helpconstraint [ @objname = ] 'table' [ , [ @nomsg = ] 'no_message' ]
-- 查看某個表的索引
sp_helpindex [ @objname = ] 'table'
-- 列出當前環境中所有的存儲過程
sp_stored_procedures
-- 添加或修改登錄賬戶的密碼
sp_password [ [ @old = ] 'old_password' , ] { [ @new =] 'new_password' } [ , [ @loginame = ] 'login' ]  
-- 顯示默認值、未加密的存儲過程、用戶定義的存儲過程、觸發器或視圖的實際文本
sp_helptext [ @objname = ] 'name' [ , [ @columnname = ] computed_column_name ] 
(2)創建自定義存儲過程

  如果我們需要創建一個自定義的存儲過程,則需要使用CREATE PROCEDURE 語句,接着之後需要補充存儲過程的代碼,如果存儲過程需要接受參數,它們需要被包括在名稱之後,基本語法如下:

CREATE PROCEDURE myStoredProcedure AS
...

OR

CREATE PROCEDURE myStoredProcedure @{Parameter Name} {data type} AS
...

  注: 參數是可選的,分爲輸入參數和輸出參數(output),並且參數允許有默認值

(3)調用存儲過程

  對於系統存儲過程,我們可以直接使用名稱調用或在前面加上EXEC來調用,如下:

存儲過程名 [參數]
or
EXEC 存儲過程名 [參數]

  而對於自定義的存儲過程則需使用EXEC來調用,如下:

EXEC 存儲過程名 [參數]
(4)帶有輸出參數的存儲過程

  當在儲存過程中需要返回多個值的時候,就可以使用輸出參數來返回這些值,調用帶有輸出參數的存儲過程的時候,需要定義變量,將變量傳遞給輸出參數,在存儲過程中使用輸出參數其實就是傳遞進來的變量
  具體的解釋請看下面的示例,這樣更便於理解一些

3、示例

  示例一:簡單的存儲過程
  下面我們來創建一個簡單的存儲過程用來打印信息,代碼如下:

CREATE PROCEDURE user_sp_PrintMessage 
	@message varchar(50)
AS
BEGIN
	PRINT '傳入的信息爲:'+ @message
END

  調用這個存儲過程

exec user_sp_PrintMessage '清風不渡'

  執行結果如下:
在這裏插入圖片描述
  示例二:設置存儲過程參數的默認值
  我們對上面創建的存儲過程做以修改,爲變量@message設置一個默認值,注意:修改時關鍵字爲ALTER,代碼如下:

ALTER PROCEDURE user_sp_PrintMessage 
	@message varchar(50) = '沒有傳入信息'
AS
BEGIN
	PRINT '傳入的信息爲:'+ @message
END

  現在來調用這個存儲過程,調用的時候不要給它傳參:

exec user_sp_PrintMessage 

  執行結果如下:
在這裏插入圖片描述
  示例三:帶輸出參數的默認參數
  現在我們來創建一個帶參數的存儲過程用於計算兩個數的和,並將結果返回,代碼如下

CREATE PROCEDURE user_sp_ReturnSum
	@number1 int,
	@number2 int,
	@returnsum int output   -- 輸出參數
AS
BEGIN
	SET @returnsum= @number1+@number2
END

  現在我們來調用這個存儲過程來計算100與200的和,代碼如下:

DECLARE @sum int
exec user_sp_ReturnSum @number1=100,@number2=200,@returnsum=@sum output
print @sum

  執行結果如下,我們可以看到100與200這兩個數先傳入存儲過程中計算,計算後的結果賦值給了存儲過程中的@returnsum變量後將結果返回,而後我們在存儲過程外用一個變量@sum來將其結果接收,最後將計算結果打印如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章