




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8章
存儲過程與觸發(fā)器8.1設(shè)計和管理存儲過程存儲過程與函數(shù)和vfp中的過程類似,是SQL服務(wù)器上一組預(yù)編譯的T-SQL語句;用于完成某項任務(wù)。1、存儲過程的類型(1)系統(tǒng)存儲過程:存在master數(shù)據(jù)庫中,名稱以sp開頭(2)用戶定義存儲過程:(3)擴展存儲過程:存在于DDL(動態(tài)鏈接庫)中,名稱以xp_開頭2、存儲過程的主要優(yōu)點(1)模塊化編程。(2)快速執(zhí)行(3)減少網(wǎng)絡(luò)通信量(4)提供安全機制8.1.1存儲過程概述8.1.2創(chuàng)建存儲過程1.格式CREATEPROCEDURE[架構(gòu)名稱.]存儲過程名
[{@parameter數(shù)據(jù)類型}[=default]--設(shè)置默認(rèn)值。[OUTPUT]--說明@parameter參數(shù)為一返回值。[,..n][WITHencryption|recompile]--對過程加密。[FORREPLICATION]--不能在服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲過程AS
<SQL語句>]2.存儲過程的各選項設(shè)置規(guī)則1)@parameter是過程中的參數(shù)。在CREATEPROCEDURE語句中可以聲明一個或多個參數(shù)。2)如果定義了default值,則無需指定此參數(shù)的值即可執(zhí)行過程。默認(rèn)值必須是常量或NULL3)OUTPUT選項指示參數(shù)是輸出參數(shù)。4)如果創(chuàng)建存儲過程時,使用WITHencryption子句,過程定義將以不可讀的形式存儲。5)FORREPLICATION不能在服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲過程。6)<SQL語句>指定過程要執(zhí)行的操作7)可以在存儲過程內(nèi)引用臨時表。8.1.2創(chuàng)建存儲過程【例8.1】創(chuàng)建一個存儲過程proc_student1用于顯示學(xué)號為“J0402”的學(xué)生基本信息(包括學(xué)生學(xué)號、姓名、性別、系)。CREATEPROCEDUREproc_student1ASSELECT學(xué)號,姓名,性別,系
FROMsWHERE學(xué)號=’J0402’GO8.1.2創(chuàng)建存儲過程1.格式
EXEC|EXECUTE[@返回狀態(tài)=]存儲過程名稱[@形參=]{value|@變量[OUTPUT]|[DEFAULT][,...n]2.說明(1)“@返回狀態(tài)”是保存過程的返回狀態(tài)值?!癅形參”是在定義存儲過程時的參數(shù)。(2)在采用“@形參=value”格式時,參數(shù)名稱和常量不必按順序提供。但是,如果參數(shù)使用了“@形參=value”格式,則對后續(xù)的所有參數(shù)均必須使用該格式。(3)“value”是傳遞給存儲過程的參數(shù)值。如果參數(shù)名稱沒有指定,參數(shù)值必須以在存儲過程中定義的順序提供。8.1.3執(zhí)行存儲過程【例8.2】現(xiàn)在我們就來執(zhí)行剛才創(chuàng)建好的存儲過程proc_student1,顯示學(xué)號為“J0402”的學(xué)生基本信息(包括學(xué)生學(xué)號、姓名、性別、系)。方法一:在SQLServerManagementStudio中執(zhí)行存儲過程方法二:使用SQL命令在新建的查詢窗口輸入命令:Executeproc_student18.1.3執(zhí)行存儲過程存儲過程和調(diào)用程序之間通過參數(shù)來傳遞數(shù)據(jù)!1.參數(shù)存儲過程的參數(shù)在創(chuàng)建時聲明,SQLServer支持兩種參數(shù):輸入?yún)?shù)和輸出參數(shù)。1)輸入?yún)?shù)輸入?yún)?shù)允許調(diào)用程序為存儲過程傳送數(shù)據(jù)值。但必須事先在CREATEPROCEDURE語句中聲明一個或多個形參。2)輸出參數(shù)輸出參數(shù)允許存儲過程將形參的數(shù)據(jù)值返回給調(diào)用程序中的實參。OUTPUT關(guān)鍵字用來指出輸出參數(shù)。8.1.4存儲過程的參數(shù)和狀態(tài)值1)輸入?yún)?shù)例8.3:創(chuàng)建一個有輸入?yún)?shù)的存儲過程proc_student2,顯示指定學(xué)號的學(xué)生基本信息(包括學(xué)生學(xué)號、姓名、性別、系)。執(zhí)行該存儲過程顯示學(xué)號為J0404的學(xué)生信息。createprocedureproc_student2@numchar(6)asSELECT學(xué)號,姓名,性別,系FROMsWHERE學(xué)號=@numexecproc_student2@num='J0404'8.1.4存儲過程的參數(shù)和狀態(tài)值例8.4:創(chuàng)建存儲過程s_info。根據(jù)學(xué)生姓名和學(xué)號查詢學(xué)生的學(xué)號,姓名,性別和所在系。ifexists(selectnamefromsysobjectswherename='s_info'andtype='p')dropprocedures_infocreateprocs_info@stnamevarchar(8),@stsnovarchar(10)asSELECT學(xué)號,姓名,性別,系FROMsWHERE姓名=@stnameand學(xué)號=@stsnogoexecs_info李麗,J0401
8.1.4存儲過程的參數(shù)和狀態(tài)值例8.7:
創(chuàng)建存儲過程s_like,根據(jù)姓名,查詢學(xué)生的姓名和平均成績。如果執(zhí)行時,沒帶參數(shù),則顯示姓陳的學(xué)生平均成績。Createprocedures_like@stnamevarchar(8)=‘陳%’Asselect姓名,平均成績=avg(sc.成績)fromsc,swheres.學(xué)號=sc.學(xué)號ands.姓名like@stname
groupby姓名GoExecutes_likeExecutes_like‘李麗’8.1.4存儲過程的參數(shù)和狀態(tài)值例8.8:創(chuàng)建存儲過程s_count,根據(jù)課程名,檢索選修某門課程的學(xué)生人數(shù)。Createprocdure
s_count@ctnamevarchar(30)=NULLAsif@ctnameisNULLprint‘請輸入課程名!’
elseselect課程名,學(xué)生選修人數(shù)=count(學(xué)號)fromsc,cwherec.課程號=sc.課程號andc.課程名=@ctname
groupby課程名GoExecutes_count‘c語言’8.1.4存儲過程的參數(shù)和狀態(tài)值2)輸出參數(shù)
作用:將過程定義中的形參的值返回到調(diào)用程序中。例8.11:建立一個過程,用于顯示指定學(xué)號的各門課程平均成績,并返回該生的平均成績。createprocproc_student3@numchar(16),@savgsmallintoutputasselect@savg=avg(成績)fromsjoinscons.學(xué)號=sc.學(xué)號wheres.學(xué)號=@numgodeclare@savg_valuesmallintexecproc_student3@num='J0401',@savg=@savg_valueoutputselect@savg_valueas‘平均成績’8.1.4存儲過程的參數(shù)和狀態(tài)值如果沒有output關(guān)鍵字結(jié)果會怎么樣2)輸出參數(shù)例8.12:創(chuàng)建過程sg,根據(jù)輸入的學(xué)號和課程號,顯示某個同學(xué)指定課程的成績并返回該成績。Createprocsg@snvarchar(8)=‘j0401’,@cnvarchar(3)=‘c02’,@grsmallintoutputAsSelect學(xué)號,課程號,成績fromscwheresc.學(xué)號=@snandsc.課程號=@cnSelect@gr=成績fromscwheresc.學(xué)號=@snandsc.課程號=@cngoDeclare@myscore
smallintset@myscore=0Executesg@sn=‘j0402’,@gr=@myscoreoutput8.1.4存儲過程的參數(shù)和狀態(tài)值2.返回值存儲過程可以返回整型狀態(tài)值,表示過程是否成功執(zhí)行。默認(rèn)返回代碼為0,表示成功執(zhí)行;若返回-1到-99之間的整數(shù),表示執(zhí)行失敗。可以使用RETURN語句,用大于0或小于-99之間的整數(shù)來定義自己的返回狀態(tài)值,以表示不同執(zhí)行結(jié)果1)RETURN語句格式RETURN[返回整型值的表達(dá)式]2)功能RETURN語句將無條件地從過程、批處理或語句塊中退出并返回整型值。8.1.4存儲過程的參數(shù)和狀態(tài)值2.返回值例8.14:
創(chuàng)建存儲過程checkstate,查詢指定課程的最高成績,如果最高成績大于90分,則返回狀態(tài)代碼1。否則,返回狀態(tài)代碼2createproccheckstate@cnovarchar(3)asif(selectmax(成績)fromscwhere課程號=@cno)>90return1elsereturn0godeclare@mystateintExecute@mystate=checkstate'c01'select@mystate8.1.4存儲過程的參數(shù)和狀態(tài)值8.1.5修改存儲過程1.格式ALTERPROCEDURE[架構(gòu)名稱.]存儲過程名[@parameter數(shù)據(jù)類型][=default]--設(shè)置默認(rèn)值。[OUTPUT]--說明定義的存儲過程參數(shù)為一返回值。[,..n][WITHencryption|recompile]--對過程進(jìn)行加密。[FORREPLICATION]AS<SQL語句>2.功能其語法和CREATEPROCEDURE很相似?!纠?.18】現(xiàn)在我們就來修改創(chuàng)建好的存儲過程proc_student3,用于顯示指定學(xué)號的學(xué)生各門課程的最高成績,執(zhí)行該存儲過程返回指定學(xué)生的最高成績.ALTERPROCEDUREc_student3 @numchar(6),@maxsmallintoutputASBEGIN SELECT@max=max(成績)FROMsJOINscONs.學(xué)號=sc.學(xué)號
WHEREs.學(xué)號=@numEND8.1.5修改存儲過程1.格式DROPPROCEDURE{存儲過程名}[,...n]2.功能從當(dāng)前數(shù)據(jù)庫中刪除一個或多個存儲過程【例8.19】現(xiàn)在我們就來刪除剛才創(chuàng)建的存儲過程proc_student4。方法一:在SQLServerManagementStudio中刪除存儲過程方法二:使用SQL命令新建一個查詢窗口,在里面輸入命令:DROPPROCEDUREproc_student48.1.6刪除存儲過程【例8.23】建立存儲過程sc_look_delete,查詢某個同學(xué)的所有課程成績,如果存在不及格課程,則刪除不及格成績記錄,否則顯示所有課程成績。CREATEPROCEDURE
sc_look_delete@sno
varchar(6)ASIFEXISTS(SELECT學(xué)號FROMscWHERE學(xué)號=@sno
and成績<60)
DELETEFROMscWHERE學(xué)號=@sno
AND成績<60ELSESELECT學(xué)號,課程號,成績FROMscWHERE學(xué)號=@snoExecutesc_look_delete‘j0401’8.1.6刪除存儲過程方法一:在ManagementStudio中查看存儲過程的定義方法二:使用命令1.sp_help格式:sp_help[[@objname=]name]2.sp_helptext格式:sp_helptext[[@objname=]name]3.sp_depends
格式:sp_depends[@objname=]’name’4.sp_stored_procedures格式:sp_stored_procedures8.1.7查看存儲過程的定義1.格式SP_RENAME
原存儲過程名,新存儲過程名2.功能將存儲過程名更改為新存儲過程名?!纠?.25】將存儲過程sg
更名為student_proc方法一:使用SQL命令SP_RENAMEsg,student_proc注意:更改對象名可能破壞腳本和存儲過程。方法二:在ManagementStudio重命名存儲過程8.1.8重命名存儲過程觸發(fā)器是特殊的存儲過程,它也定義了一組Transact-SQL語句,用于完成某項任務(wù)。
觸發(fā)器的主要作用是能強制數(shù)據(jù)完整性,保證數(shù)據(jù)一致性,主要表現(xiàn)為:強化約束保證參照完整性級聯(lián)運行跟蹤變化創(chuàng)建觸發(fā)器時需指定:名稱、在其上定義觸發(fā)器的表、觸發(fā)器將何時激發(fā)、激活觸發(fā)器的數(shù)據(jù)修改語句。8.2設(shè)計和管理觸發(fā)器8.2.1觸發(fā)器概述1.格式CREATETRIGGER[架構(gòu)的名稱.]觸發(fā)器名
ON表名|視圖[WITHencryption]--對文本進(jìn)行加密。{FOR|AFTER|INSTEADOF}[delete][,insert][,update]AS[SQL語句]2.功能AFTER:指定觸發(fā)器只有在觸發(fā)SQL語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。INSTEADOF:指定執(zhí)行觸發(fā)器而不是執(zhí)行“觸發(fā)SQL語句”,從而替代“觸發(fā)語句”的操作。對于表或視圖,每個INSERT、UPDATE或DELETE語句最多可定義一個INSTEADOF觸發(fā)器。8.2.2創(chuàng)建觸發(fā)器【例8.26】在學(xué)生選課表sc上創(chuàng)建一個觸發(fā)器trigger_student1,該觸發(fā)器被INSERT操作觸發(fā),當(dāng)用戶向sc表插入一條新記錄時,判斷該記錄的學(xué)號在學(xué)生基本信息表s中是否存在,如果存在插入成功,否則插入失敗。CREATETRIGGERtrigger_student1ONscAFTERINSERTASBEGINIF(SELECTcount(*)FROMinsertedJOINsONinserted.學(xué)號=s.學(xué)號)=0BEGIN ROLLBACKTRAN–取消所做的插入操作 PRINT'插入記錄無效!' ENDEND8.2.2創(chuàng)建觸發(fā)器【例8.26】在學(xué)生信息表S上創(chuàng)建一個觸發(fā)器trigger_stu2,該觸發(fā)器被delete操作觸發(fā)。當(dāng)在表S中刪除一條記錄時,判斷該生是否在選課成績表sc中有數(shù)據(jù),如果沒有則允許刪除,否則不允許刪除。Createtriggertrigger_stu2onsafterdeleteAsbegin
if(exists(select*fromdeletedjoinscondeleted.學(xué)號=sc.學(xué)號))beginrollbacktranprint‘不允許刪除該生信息’endend8.2.2創(chuàng)建觸發(fā)器注意:1、在觸發(fā)器執(zhí)行過程中,SQLSERVER會建立和管理兩個臨時的虛擬表:deleted表和inserted表。2、當(dāng)向表中插入數(shù)據(jù)時,insert觸發(fā)器會執(zhí)行,并將新記錄插入到inserted表中。3、當(dāng)從表中刪除數(shù)據(jù)時,delete觸發(fā)器會執(zhí)行,并將被刪除的記錄存放到deleted表中。4、對于修改操作,update觸發(fā)器會執(zhí)行,并將更新前的記錄存儲在deleted表中,然后將更新后的記錄儲在inserted表中。8.2.2創(chuàng)建觸發(fā)器【例8.28】在學(xué)生信息表s上創(chuàng)建一個觸發(fā)器my_edit,該觸發(fā)器被update操作觸發(fā)。當(dāng)用戶在S表修改某個學(xué)生的學(xué)號時,同時自動更新選課成績表SC中該生對應(yīng)記錄的學(xué)號Createtriggermy_edit
onSafterupdateAsbeginupdatescset學(xué)號=(select學(xué)號frominserted)where學(xué)號in(select學(xué)號fromdeleted)end8.2.2創(chuàng)建觸發(fā)器【例8.28】創(chuàng)建一個觸發(fā)器reminder,如果修改、刪除和插入學(xué)生信息表S中的任何數(shù)據(jù),則向用戶顯示信息“不能對數(shù)據(jù)表進(jìn)行任何修改!”Ifexists(selectnamefromsysobjectswherename=‘reminder’andtype=‘tr’)droptriggerreminderCreatetriggerreminderonsforinsert,update,deleteAsbegin
raiserror(‘不能對數(shù)據(jù)表進(jìn)行任何修改!’,16,10)end8.2.2創(chuàng)建觸發(fā)器返回用戶定義的錯誤提示信息,記錄發(fā)生的錯誤。1.格式RAISERROR({msg_id|msg_str}{,嚴(yán)重級別,狀態(tài)}2.功能(1)msg_id是存儲于sysmessages
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藤制品企業(yè)的品牌形象傳播策略考核試卷
- 電機在消防設(shè)備的緊急響應(yīng)考核試卷
- 人教版《分?jǐn)?shù)的概念與應(yīng)用》課件
- 谷物儲存的糧食儲存容量提升考核試卷
- 塑料制品的環(huán)保法規(guī)遵守考核試卷
- 新車上戶需要什么手續(xù)和上戶流程
- 環(huán)境衛(wèi)生課件
- 網(wǎng)絡(luò)安全防護(hù)在能源交易平臺的數(shù)據(jù)保護(hù)評估考核試卷
- 耐火土石礦山綠色開采與循環(huán)經(jīng)濟考核試卷
- 2025年石英或云母填充塑料項目建議書
- 2025年云計算與大數(shù)據(jù)技術(shù)考試試題及答案
- 納西族文化課件
- 水利水電工程技術(shù)術(shù)語全
- 2024-2025教科版科學(xué)一年級下冊第二單元測試卷及答案
- 中國共產(chǎn)主義青年團紀(jì)律處分條例試行解讀學(xué)習(xí)
- 醫(yī)療器械研究報告醫(yī)療器械產(chǎn)業(yè)現(xiàn)狀及未來發(fā)展趨勢分析報告(2025年)
- 數(shù)字孿生技術(shù)在智慧能源系統(tǒng)中的挑戰(zhàn)與機遇
- 拋石專項施工方案
- 電力增材再造技術(shù)的創(chuàng)新與發(fā)展
- 話劇導(dǎo)演合同協(xié)議
- 客服代理合同協(xié)議
評論
0/150
提交評論