版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章
存儲過程與觸發(fā)器8.1設計和管理存儲過程存儲過程與函數(shù)和vfp中的過程類似,是SQL服務器上一組預編譯的T-SQL語句;用于完成某項任務。1、存儲過程的類型(1)系統(tǒng)存儲過程:存在master數(shù)據(jù)庫中,名稱以sp開頭(2)用戶定義存儲過程:(3)擴展存儲過程:存在于DDL(動態(tài)鏈接庫)中,名稱以xp_開頭2、存儲過程的主要優(yōu)點(1)模塊化編程。(2)快速執(zhí)行(3)減少網(wǎng)絡通信量(4)提供安全機制8.1.1存儲過程概述8.1.2創(chuàng)建存儲過程1.格式CREATEPROCEDURE[架構名稱.]存儲過程名
[{@parameter數(shù)據(jù)類型}[=default]--設置默認值。[OUTPUT]--說明@parameter參數(shù)為一返回值。[,..n][WITHencryption|recompile]--對過程加密。[FORREPLICATION]--不能在服務器上執(zhí)行為復制創(chuàng)建的存儲過程AS
<SQL語句>]2.存儲過程的各選項設置規(guī)則1)@parameter是過程中的參數(shù)。在CREATEPROCEDURE語句中可以聲明一個或多個參數(shù)。2)如果定義了default值,則無需指定此參數(shù)的值即可執(zhí)行過程。默認值必須是常量或NULL3)OUTPUT選項指示參數(shù)是輸出參數(shù)。4)如果創(chuàng)建存儲過程時,使用WITHencryption子句,過程定義將以不可讀的形式存儲。5)FORREPLICATION不能在服務器上執(zhí)行為復制創(chuàng)建的存儲過程。6)<SQL語句>指定過程要執(zhí)行的操作7)可以在存儲過程內引用臨時表。8.1.2創(chuàng)建存儲過程【例8.1】創(chuàng)建一個存儲過程proc_student1用于顯示學號為“J0402”的學生基本信息(包括學生學號、姓名、性別、系)。CREATEPROCEDUREproc_student1ASSELECT學號,姓名,性別,系
FROMsWHERE學號=’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,顯示學號為“J0402”的學生基本信息(包括學生學號、姓名、性別、系)。方法一:在SQLServerManagementStudio中執(zhí)行存儲過程方法二:使用SQL命令在新建的查詢窗口輸入命令:Executeproc_student18.1.3執(zhí)行存儲過程存儲過程和調用程序之間通過參數(shù)來傳遞數(shù)據(jù)!1.參數(shù)存儲過程的參數(shù)在創(chuàng)建時聲明,SQLServer支持兩種參數(shù):輸入?yún)?shù)和輸出參數(shù)。1)輸入?yún)?shù)輸入?yún)?shù)允許調用程序為存儲過程傳送數(shù)據(jù)值。但必須事先在CREATEPROCEDURE語句中聲明一個或多個形參。2)輸出參數(shù)輸出參數(shù)允許存儲過程將形參的數(shù)據(jù)值返回給調用程序中的實參。OUTPUT關鍵字用來指出輸出參數(shù)。8.1.4存儲過程的參數(shù)和狀態(tài)值1)輸入?yún)?shù)例8.3:創(chuàng)建一個有輸入?yún)?shù)的存儲過程proc_student2,顯示指定學號的學生基本信息(包括學生學號、姓名、性別、系)。執(zhí)行該存儲過程顯示學號為J0404的學生信息。createprocedureproc_student2@numchar(6)asSELECT學號,姓名,性別,系FROMsWHERE學號=@numexecproc_student2@num='J0404'8.1.4存儲過程的參數(shù)和狀態(tài)值例8.4:創(chuàng)建存儲過程s_info。根據(jù)學生姓名和學號查詢學生的學號,姓名,性別和所在系。ifexists(selectnamefromsysobjectswherename='s_info'andtype='p')dropprocedures_infocreateprocs_info@stnamevarchar(8),@stsnovarchar(10)asSELECT學號,姓名,性別,系FROMsWHERE姓名=@stnameand學號=@stsnogoexecs_info李麗,J0401
8.1.4存儲過程的參數(shù)和狀態(tài)值例8.7:
創(chuàng)建存儲過程s_like,根據(jù)姓名,查詢學生的姓名和平均成績。如果執(zhí)行時,沒帶參數(shù),則顯示姓陳的學生平均成績。Createprocedures_like@stnamevarchar(8)=‘陳%’Asselect姓名,平均成績=avg(sc.成績)fromsc,swheres.學號=sc.學號ands.姓名like@stname
groupby姓名GoExecutes_likeExecutes_like‘李麗’8.1.4存儲過程的參數(shù)和狀態(tài)值例8.8:創(chuàng)建存儲過程s_count,根據(jù)課程名,檢索選修某門課程的學生人數(shù)。Createprocdure
s_count@ctnamevarchar(30)=NULLAsif@ctnameisNULLprint‘請輸入課程名!’
elseselect課程名,學生選修人數(shù)=count(學號)fromsc,cwherec.課程號=sc.課程號andc.課程名=@ctname
groupby課程名GoExecutes_count‘c語言’8.1.4存儲過程的參數(shù)和狀態(tài)值2)輸出參數(shù)
作用:將過程定義中的形參的值返回到調用程序中。例8.11:建立一個過程,用于顯示指定學號的各門課程平均成績,并返回該生的平均成績。createprocproc_student3@numchar(16),@savgsmallintoutputasselect@savg=avg(成績)fromsjoinscons.學號=sc.學號wheres.學號=@numgodeclare@savg_valuesmallintexecproc_student3@num='J0401',@savg=@savg_valueoutputselect@savg_valueas‘平均成績’8.1.4存儲過程的參數(shù)和狀態(tài)值如果沒有output關鍵字結果會怎么樣2)輸出參數(shù)例8.12:創(chuàng)建過程sg,根據(jù)輸入的學號和課程號,顯示某個同學指定課程的成績并返回該成績。Createprocsg@snvarchar(8)=‘j0401’,@cnvarchar(3)=‘c02’,@grsmallintoutputAsSelect學號,課程號,成績fromscwheresc.學號=@snandsc.課程號=@cnSelect@gr=成績fromscwheresc.學號=@snandsc.課程號=@cngoDeclare@myscore
smallintset@myscore=0Executesg@sn=‘j0402’,@gr=@myscoreoutput8.1.4存儲過程的參數(shù)和狀態(tài)值2.返回值存儲過程可以返回整型狀態(tài)值,表示過程是否成功執(zhí)行。默認返回代碼為0,表示成功執(zhí)行;若返回-1到-99之間的整數(shù),表示執(zhí)行失敗??梢允褂肦ETURN語句,用大于0或小于-99之間的整數(shù)來定義自己的返回狀態(tài)值,以表示不同執(zhí)行結果1)RETURN語句格式RETURN[返回整型值的表達式]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[架構名稱.]存儲過程名[@parameter數(shù)據(jù)類型][=default]--設置默認值。[OUTPUT]--說明定義的存儲過程參數(shù)為一返回值。[,..n][WITHencryption|recompile]--對過程進行加密。[FORREPLICATION]AS<SQL語句>2.功能其語法和CREATEPROCEDURE很相似?!纠?.18】現(xiàn)在我們就來修改創(chuàng)建好的存儲過程proc_student3,用于顯示指定學號的學生各門課程的最高成績,執(zhí)行該存儲過程返回指定學生的最高成績.ALTERPROCEDUREc_student3 @numchar(6),@maxsmallintoutputASBEGIN SELECT@max=max(成績)FROMsJOINscONs.學號=sc.學號
WHEREs.學號=@numEND8.1.5修改存儲過程1.格式DROPPROCEDURE{存儲過程名}[,...n]2.功能從當前數(shù)據(jù)庫中刪除一個或多個存儲過程【例8.19】現(xiàn)在我們就來刪除剛才創(chuàng)建的存儲過程proc_student4。方法一:在SQLServerManagementStudio中刪除存儲過程方法二:使用SQL命令新建一個查詢窗口,在里面輸入命令:DROPPROCEDUREproc_student48.1.6刪除存儲過程【例8.23】建立存儲過程sc_look_delete,查詢某個同學的所有課程成績,如果存在不及格課程,則刪除不及格成績記錄,否則顯示所有課程成績。CREATEPROCEDURE
sc_look_delete@sno
varchar(6)ASIFEXISTS(SELECT學號FROMscWHERE學號=@sno
and成績<60)
DELETEFROMscWHERE學號=@sno
AND成績<60ELSESELECT學號,課程號,成績FROMscWHERE學號=@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.功能將存儲過程名更改為新存儲過程名。【例8.25】將存儲過程sg
更名為student_proc方法一:使用SQL命令SP_RENAMEsg,student_proc注意:更改對象名可能破壞腳本和存儲過程。方法二:在ManagementStudio重命名存儲過程8.1.8重命名存儲過程觸發(fā)器是特殊的存儲過程,它也定義了一組Transact-SQL語句,用于完成某項任務。
觸發(fā)器的主要作用是能強制數(shù)據(jù)完整性,保證數(shù)據(jù)一致性,主要表現(xiàn)為:強化約束保證參照完整性級聯(lián)運行跟蹤變化創(chuàng)建觸發(fā)器時需指定:名稱、在其上定義觸發(fā)器的表、觸發(fā)器將何時激發(fā)、激活觸發(fā)器的數(shù)據(jù)修改語句。8.2設計和管理觸發(fā)器8.2.1觸發(fā)器概述1.格式CREATETRIGGER[架構的名稱.]觸發(fā)器名
ON表名|視圖[WITHencryption]--對文本進行加密。{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】在學生選課表sc上創(chuàng)建一個觸發(fā)器trigger_student1,該觸發(fā)器被INSERT操作觸發(fā),當用戶向sc表插入一條新記錄時,判斷該記錄的學號在學生基本信息表s中是否存在,如果存在插入成功,否則插入失敗。CREATETRIGGERtrigger_student1ONscAFTERINSERTASBEGINIF(SELECTcount(*)FROMinsertedJOINsONinserted.學號=s.學號)=0BEGIN ROLLBACKTRAN–取消所做的插入操作 PRINT'插入記錄無效!' ENDEND8.2.2創(chuàng)建觸發(fā)器【例8.26】在學生信息表S上創(chuàng)建一個觸發(fā)器trigger_stu2,該觸發(fā)器被delete操作觸發(fā)。當在表S中刪除一條記錄時,判斷該生是否在選課成績表sc中有數(shù)據(jù),如果沒有則允許刪除,否則不允許刪除。Createtriggertrigger_stu2onsafterdeleteAsbegin
if(exists(select*fromdeletedjoinscondeleted.學號=sc.學號))beginrollbacktranprint‘不允許刪除該生信息’endend8.2.2創(chuàng)建觸發(fā)器注意:1、在觸發(fā)器執(zhí)行過程中,SQLSERVER會建立和管理兩個臨時的虛擬表:deleted表和inserted表。2、當向表中插入數(shù)據(jù)時,insert觸發(fā)器會執(zhí)行,并將新記錄插入到inserted表中。3、當從表中刪除數(shù)據(jù)時,delete觸發(fā)器會執(zhí)行,并將被刪除的記錄存放到deleted表中。4、對于修改操作,update觸發(fā)器會執(zhí)行,并將更新前的記錄存儲在deleted表中,然后將更新后的記錄儲在inserted表中。8.2.2創(chuàng)建觸發(fā)器【例8.28】在學生信息表s上創(chuàng)建一個觸發(fā)器my_edit,該觸發(fā)器被update操作觸發(fā)。當用戶在S表修改某個學生的學號時,同時自動更新選課成績表SC中該生對應記錄的學號Createtriggermy_edit
onSafterupdateAsbeginupdatescset學號=(select學號frominserted)where學號in(select學號fromdeleted)end8.2.2創(chuàng)建觸發(fā)器【例8.28】創(chuàng)建一個觸發(fā)器reminder,如果修改、刪除和插入學生信息表S中的任何數(shù)據(jù),則向用戶顯示信息“不能對數(shù)據(jù)表進行任何修改!”Ifexists(selectnamefromsysobjectswherename=‘reminder’andtype=‘tr’)droptriggerreminderCreatetriggerreminderonsforinsert,update,deleteAsbegin
raiserror(‘不能對數(shù)據(jù)表進行任何修改!’,16,10)end8.2.2創(chuàng)建觸發(fā)器返回用戶定義的錯誤提示信息,記錄發(fā)生的錯誤。1.格式RAISERROR({msg_id|msg_str}{,嚴重級別,狀態(tài)}2.功能(1)msg_id是存儲于sysmessages
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024建筑工程勞務承包合同(范本)
- 吉林大學《數(shù)字電路》2021-2022學年期末試卷
- 2021物流行業(yè)安全管控能力分析報告
- 2024-2025學年新教材高中地理第2章自然地理要素及現(xiàn)象第1節(jié)第2課時風沙地貌和喀斯特地貌學案中圖版必修第一冊
- 2024-2025學年高中歷史第六單元穆罕默德阿里改革第3課改革的后果1教學教案新人教版選修1
- 2024-2025學年高中歷史專題一二走向“大一統(tǒng)”的秦漢政治課時作業(yè)含解析人民版必修1
- 2025屆高考英語3500詞匯基礎+提升練23含解析
- 交通安全經費保障制度
- 醫(yī)學微生物學與免疫學學習通超星期末考試答案章節(jié)答案2024年
- 中國古代文學經典作品選講2學習通超星期末考試答案章節(jié)答案2024年
- 口腔新技術護理課件
- 社交電商的供應鏈管理和優(yōu)化
- 高考物理系統(tǒng)性復習 (能力提高練) 第五節(jié) 實驗:探究小車速度隨時間變化的規(guī)律(附解析)
- 題材05鄉(xiāng)土小說專題精練-2024年高考語文二輪復習三點突破講解專練
- 南京理工大學2015年613物理化學(含答案)考研真題
- 輿情處置培訓課件
- 卡仕達dvd導航一體機說明書
- 2024年中國鐵路廣州局集團招聘筆試參考題庫含答案解析
- 人工智能在文化傳承與遺產保護中的價值實現(xiàn)
- ISTA標準-2A、2B、2C系列解讀(圖文)
- 退費賬戶確認書
評論
0/150
提交評論