儲存過程實驗

2021-04-13 21:20:23 字數 3562 閱讀 6516

1、使用不帶引數的儲存過程

(1)建立乙個儲存過程my_proc,查詢「學生表」中所有計算機系女生的學號、姓名、性別、年齡和所在院系。

create proc my_proc as

select 學號,姓名,性別,年齡,所在院系

from students

where 性別='女' and 所在院系='計算機'

return

(2)執行儲存過程

exec my_proc

(3)修改儲存過程,使其能夠查詢計算機系女生的所有基本資訊

alter proc my_proc as

select *

from students

where 性別='女' and 所在院系='計算機'

return

2、帶輸入引數的儲存過程

(1)建立乙個儲存過程my_proc***,使其能夠查詢「學生表」中男學生或女學生的學號、姓名、性別、年齡和所在院系

create proc my_proc*** @*** varchar(128) as

select 學號,姓名,性別,年齡,所在院系

from students

where 性別=@***

return

(2)執行儲存過程

exec my_proc*** @***='男';

exec my_proc*** @***='女';

3、帶輸入/輸出引數的儲存過程

(1)建立乙個儲存過程my_procage,使其能夠根據學生姓名,查詢學生年齡。(考慮當學生不存在時給出提示資訊)

1)建立儲存過程my_procage:

drop proc my_procage

create proc my_procage @name varchar(80),@age int output

asif not exists(

select *

from students

where 姓名=@name)

return -1

select @age=年齡

from students

where 姓名=@name

return

2)執行儲存過程

--1.沒有張鍵這個學生

declare @status int

declare @agedata int

exec @status=my_procage @name='張鍵',@age=@agedata output

if @status = -1

print '不存在此學生'

else

print '此學生年齡為'+convert(varchar(10),@agedata)

--2.存在李濤這個學生

declare @status int

declare @agedata int

exec @status=my_procage @name='李濤',@age=@agedata output

if @status = -1

print '不存在此學生'

else

print '此學生年齡為'+convert(varchar(10),@agedata)

以上儲存過程執行的幾種不同情況比較了帶參輸入/輸出。由於sql server 定義了一張內部狀態碼表。所以如果儲存過程中出現表中定義的錯誤,則返回乙個狀態碼,客戶端隨即根據返回的狀態碼值判斷出錯原因,列印錯誤提示資訊。

4、返回狀態值的儲存過程

(1)建立乙個儲存過程my_procstatus,使其能夠根據學生姓名,查詢學生的選課資訊。(如果沒有輸入學生姓名,返回狀態碼55;如果輸入的學生姓名不存在,則返回狀態碼-155)

drop proc my_procstatus

create proc my_procstatus @name varchar(80)

asif @name=''

return 55

else if not exists(

select *

from students

where 姓名=@name)

return -155

else

select g.課程號

from students s right outer join grade g on s.學號=g.學號

where s.姓名=@name

return

(2)執行儲存過程:接收儲存過程返回的狀態碼,如果返回的狀態碼為55則輸出提示資訊「沒有輸入名字!!」;如果返回的狀態碼為-155,則輸出「沒找到!!」。

declare @status int

exec @status=my_procstatus @name=''

if @status = 55

print '沒有輸入名字'

else if @status = -155

print '沒找到'

(3)刪除儲存過程

drop proc my_procstatus

上述過程中,值得注意的是兩種返回方式的比較:

如果輸入為空值,則返回給伺服器的是status值55;如果輸入的值在資料庫中無法檢索到,則返回給伺服器的status是-155。這種方式的好處是返回給伺服器的是乙個整形值,簡單方便且給伺服器很小的壓力,乙個短小的整形狀態碼代表了一類錯誤狀態。否則返回給伺服器的只能是字串資訊。(2)中伺服器執行儲存過程,如果@name為空,則伺服器給客戶端返回乙個狀態碼,客戶端根據狀態碼列印相應的提示資訊。

5、在儲存過程中使用臨時表,不指定題目,請理解全域性臨時表與區域性臨時表的區別

建立儲存過程temp_proc,查詢成績表grade全部記錄,放到區域性臨時表temp_1和全域性臨時表temp_2中,從兩張臨時表讀全部記錄,分析差別

create proc temp_proc

asselect * into #temp_1

from grade

select * into ##temp_2

from grade

return

exec temp_proc

select * from #temp_1

select * from ##temp_2

這裡兩種不同的臨時表區別如下:

使用臨時表

臨時表是在tempdb中建立的表。臨時表的名稱都以「#」開頭。臨時表的範圍為建立臨時表的連線。因為,臨時表不能在兩個連線之間共享,一旦連線關閉,臨時表就會被丟棄。如果臨時表被建立於儲存過程之中,則臨時表的範圍在儲存過程之中,或者被該儲存過程呼叫的任何儲存過程之中。如果需要在連線之間共享臨時表,則需要使用全域性的臨時表。全域性的臨時表以「##」符號開頭,它將一直存在於資料庫中,直到sql server重新啟動。一旦這類臨時表建立之後,所有的使用者都可以訪問到。在臨時表上不能明確地指明許可權。臨時表提供了儲存中間結果的能力。有時候,臨時表還能通過將乙個複雜的查詢分解成兩個查詢而獲得效能的改善。這可以通過首先將第乙個查詢的結果存在臨時表中,然後在第二個查詢中使用臨時表來實現。當乙個大表中的某個子集在乙個在座過程中使用多次時,建議使用臨時表。在這種情況下,在臨時表中保持資料的子集,以在隨後的連線中使用,這樣能大大改善效能。還可以在臨時表中建立索引。

實驗八 儲存過程2

實驗八儲存過程 一 實驗內容 1 儲存過程的建立 2 儲存過程的呼叫 二 實驗專案 學生成績資料庫 建立用於學生成績管理資料庫,資料庫名為xscj中,xscj資料庫中包括三個表 xs 學生基本情況表 kc 課程資訊表 xs cj 成績表 三 實驗步驟 要求每個儲存過程建立成功之後必須進行呼叫檢驗 1...

實驗 oracle剖析儲存過程效能

導言 在日常oracle開發中有時候乙個儲存過程執行的時間很長,想要定位儲存過程的效能問題時最笨的辦法是開啟儲存過程一行行的肉眼看哪一行sql,可能存在問題。從oracle 8i開始提供了乙個profiler工具用於剖析儲存過程的效能問題。但是前提是安裝了相應的包。declare vresult b...

sql sever 儲存過程總結及實驗

定義 儲存過程是資料庫中的乙個功能,是一組為了完成特定功能 可以接收和返回使用者引數的t sql語句預編譯集合,經過編譯後儲存在資料庫中,以乙個名稱儲存並作為乙個單元處理。儲存過程儲存在資料庫內,可由應用程式通過乙個呼叫執行,而且允許使用者宣告變數 帶引數執行以及其他強大的程式設計功能。儲存過程在第...