




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章
數(shù)據(jù)庫(kù)服務(wù)端編程Database西北工業(yè)大學(xué)NorthwesternPolytechnicalUniversity數(shù)據(jù)庫(kù)目錄7.1
實(shí)戰(zhàn)目標(biāo)與準(zhǔn)備7.2變量7.3
函數(shù)7.4存儲(chǔ)過程7.5SQL控制流程語(yǔ)句7.6游標(biāo)7.7觸發(fā)器7.8預(yù)處理SQL語(yǔ)句7.9銀行場(chǎng)景化綜合實(shí)戰(zhàn)7.1實(shí)戰(zhàn)目標(biāo)與準(zhǔn)備實(shí)戰(zhàn)目標(biāo)數(shù)據(jù)庫(kù)服務(wù)端編程指編寫運(yùn)行在數(shù)據(jù)庫(kù)服務(wù)端的程序,具體主要包括服務(wù)端的存儲(chǔ)過程、自定義函數(shù)、觸發(fā)器等。為了便于描述,本書將存儲(chǔ)過程、用戶自定義函數(shù)、觸發(fā)器等不同形式的數(shù)據(jù)庫(kù)服務(wù)端程序統(tǒng)稱為SQL程序。掌握MySQL數(shù)據(jù)庫(kù)服務(wù)端編程的基本知識(shí),包括編寫服務(wù)端程序需要的變量、控制流程語(yǔ)句、游標(biāo)、存儲(chǔ)過程、自定義函數(shù)、觸發(fā)器、事件等。7.2變量全局變量(global,系統(tǒng)變量,不能自定義,可改值)會(huì)話變量(session,系統(tǒng)變量,不能自定義,可改值)用戶變量(@var,用戶可以自定義)局部變量(參數(shù),declare)
7.2變量MySQL的用戶變量
@var,以“@”開頭,可以作用于當(dāng)前整個(gè)連接,但是若當(dāng)前連接斷開后,所定義的用戶變量都會(huì)消失??梢栽诖鎯?chǔ)過程之間傳遞全局范圍的變量。
賦值:set@count=1;
selectcount(id)into@count
fromitemswhereprice<99;讀?。簊elect@count;7.2變量MySQL的局部變量
注意:
1)支持SQL的數(shù)據(jù)類型
2)給出DEFAULT,該變量進(jìn)入BEGIN塊時(shí)初始化為該值.例:DECLARE語(yǔ)句部分聲明變量,SET進(jìn)行賦值。declarenamesvarchar(10)default'';declareiintdefault0;setnames=concat('test','');字符串拼接函數(shù):concat7.2變量MySQL變量對(duì)比
7.3函數(shù)——系統(tǒng)內(nèi)置函數(shù)SQL常用的內(nèi)置函數(shù)可以分為:數(shù)學(xué)函數(shù)(如絕對(duì)值函數(shù)等)聚合函數(shù)(如求和、求平均函數(shù)等)字符串函數(shù)(如求字符串長(zhǎng)度、求子串函數(shù)等)日期和時(shí)間函數(shù)(如返回當(dāng)前日期函數(shù)等)格式化函數(shù)(如字符串轉(zhuǎn)IP地址函數(shù)等)控制流函數(shù)(如邏輯判斷函數(shù)等)加密函數(shù)(如使用密鑰對(duì)字符串加密函數(shù)等)系統(tǒng)信息函數(shù)(如返回當(dāng)前數(shù)據(jù)庫(kù)名、服務(wù)器版本函數(shù)等)7.3函數(shù)——用戶自定義函數(shù)delimiter$$createfunction函數(shù)名(參數(shù)類型)returns返回類型Begin
方法體
return數(shù)據(jù)類型;end$$delimiter;select函數(shù)名
7.3函數(shù)——用戶自定義函數(shù)要求:指定年和月時(shí),編寫一個(gè)自定義函數(shù):求該年該月的平均氣溫。某氣象站有一張表temperature,每天在2點(diǎn),8點(diǎn),14點(diǎn),20點(diǎn)自動(dòng)采集溫度7.3函數(shù)——用戶自定義函數(shù)DELIMITER$CREATEFUNCTIONtemp_avg(myyearint,mymonthint)RETURNSrealBEGINDECLAREtemprealDEFAULT0;SELECT(SUM(T02)+SUM(T08)+SUM(T14)+SUM(T20))/(Count(T02)+Count(T08)+Count(T14)+Count(T20))INTOtempFROMTemperatureWHEREYear=myyearANDMonth=mymonth;returntemp;END$某氣象站有一張表temperature,每天在2點(diǎn),8點(diǎn),14點(diǎn),20點(diǎn)自動(dòng)采集溫度7.4存儲(chǔ)過程delimiter$$createprocedure存儲(chǔ)過程名(參數(shù))Begin
方法體end$$delimiter;call存儲(chǔ)過程名
7.4存儲(chǔ)過程MYSQL存儲(chǔ)過程/存儲(chǔ)函數(shù)完整語(yǔ)法7.4存儲(chǔ)過程存儲(chǔ)過程示例7.4存儲(chǔ)過程MySQL的參數(shù)傳遞存儲(chǔ)過程:IN,OUT,INOUT類型函數(shù):所有參數(shù)為IN類型7.5SQL控制流程語(yǔ)句MySQL流程控制:條件分支IFsearch_conditionTHENstatement_list[ELSEIFsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDIFCASEcase_value
WHENwhen_valueTHENstatement_list[WHENwhen_valueTHENstatement_list]...[ELSEstatement_list]ENDCASECASE
WHENsearch_conditionTHENstatement_list[WHENsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDCASEIFCASEWHEN7.5SQL控制流程語(yǔ)句MySQL流程控制:循環(huán)REPEAT[begin_label:]REPEATstatement_listUNTILsearch_conditionENDREPEAT[end_label]mysql>delimiter//mysql>CREATEPROCEDUREdorepeat(p1INT)BEGINSET@x=0;
REPEATSET@x=@x+1;
UNTIL@x>p1ENDREPEAT;END//QueryOK,0rowsaffected(0.00sec)mysql>CALLdorepeat(1000)//QueryOK,0rowsaffected(0.00sec)7.5SQL控制流程語(yǔ)句MySQL流程控制:循環(huán)WHILE[begin_label:]WHILEsearch_conditionDOstatement_listENDWHILE[end_label]CREATEPROCEDURE
dowhile()BEGINDECLAREv1INTDEFAULT5;
WHILEv1>0DO...SETv1=v1-1;
ENDWHILE;END;7.5SQL控制流程語(yǔ)句MySQL流程控制:循環(huán)LOOP[begin_label:]LOOPstatement_listENDLOOP[end_label]CREATEPROCEDUREdoiterate(p1INT)BEGIN
label1:LOOPSETp1=p1+1;IFp1<10THEN
ITERATElabel1;ENDIF;
LEAVElabel1;
ENDLOOP
label1;SET@x=p1;END;7.6游標(biāo)游標(biāo)
若查詢SQL只返回一條記錄可以放入一個(gè)變量,當(dāng)返回
多條記錄時(shí),需使用游標(biāo)逐行處理結(jié)果集。聲明游標(biāo)(DECLARE)打開游標(biāo)(OPEN)使用游標(biāo)讀取數(shù)據(jù)(FETCH)關(guān)閉游標(biāo)(CLOSE)7.6游標(biāo)delimiter$$createprocedureget_cs_s()begin
declareout_namesvarchar(100)default'';declaretmpvarchar(100)default'';declarep_snovarchar(5)default'';declareP_snamevarchar(10)default'';declaredonebooleandefault0;
declarecursor_namecursorforselectsno,snamefromswheresdept='CS';
declarecontinuehandlerforsqlstate'02000'
setdone=1;
--ER_SP_FETCH_NO_DATA
opencursor_name;
fetchcursor_nameintop_sno,p_sname;
repeat
settmp=concat(p_sno,'_',p_sname);setout_names=concat(out_names,tmp,'');
fetchcursor_nameintop_sno,p_sname;
untildone
endrepeat;
closecursor_name;
selectout_names;end$$delimiter;7.7觸發(fā)器1.觸發(fā)器定義-MySQL7.7觸發(fā)器2.觸發(fā)器的分類(DML)BEFORE觸發(fā)器AFTER觸發(fā)器INSTEADOF觸發(fā)器執(zhí)行INSTEADOF觸發(fā)器代替通常的增刪改等觸發(fā)動(dòng)作。PG:僅支持視圖上的該觸發(fā)器。INSERT觸發(fā)器UPDATE觸發(fā)器TRUNCATE觸發(fā)器DELETE觸發(fā)器在定義了觸發(fā)器的表上發(fā)生修改操作時(shí),會(huì)自動(dòng)為觸發(fā)器的運(yùn)行而派生兩個(gè)記錄:1)Old—存放舊記錄(for:delete,update)2)New—存放新記錄(for:insert,update)REFERENCING子句:將對(duì)應(yīng)記錄聲明為一個(gè)表格使用7.7觸發(fā)器2.觸發(fā)器的分類(DML)WhenEventRow-levelStatement-level(mysql不支持)BEFORE/AFTER
INSERT/UPDATE/DELETETableTableandViewBEFORE/AFTERTRUNCATE-TableINSTEADOF(mysql不支持)INSERT/UPDATE/DELETEViewTRUNCATE:清空表中的數(shù)據(jù),但是不刪除表結(jié)構(gòu)Trigger可以暫?;蛘邌⒂?.7觸發(fā)器3.觸發(fā)器修改/刪除修改:不支持
刪除DROPTRIGGERdatabase.trigger_name(mysql)DROPTRIGGERtrigger_nameONtablename
(其他多數(shù)DBMS)查看觸發(fā)器:SHOWTRIGGERS7.7觸發(fā)器引用:/doc/refman/8.0/en/signal.htmlusestudent;droptriggerifexistsdel_s;delimiter$$createtriggerdel_sbeforedeleteonsforeachrowbeginifOLD.snoin(selectdistinct(sno)fromsc)then
signalsqlstate'03100'setmessage_text='不能刪除有選課記錄的學(xué)生';endif;end$$delimiter;sqlstate:='00'(success)='01'(warning)='02'(notfound)>'02'(exception)='40'MySQL中的異常處理:signalsqlstate7.7觸發(fā)器signalsqlstate'31000':錯(cuò)誤代碼說明(00表示正常,不能用于signal語(yǔ)句)
7.7觸發(fā)器/doc/refman/8.0/en/trigger-syntax.html同一個(gè)表上可以存在兩個(gè)同類型同事件的觸發(fā)器(如兩個(gè)beforeupdate),順序是按照創(chuàng)建順序被觸發(fā);如果希望顯示指定觸發(fā)器的順序,可以通過:precedes或者follows關(guān)鍵字指定7.7觸發(fā)器4.MySQL中的Event
(不是一種通常意義的觸發(fā)器)/doc/refman/8.0/en/create-event.html7.7觸發(fā)器5.觸發(fā)器示例1-MySQL例1:創(chuàng)建一個(gè)觸發(fā)器,當(dāng)每插入一條記錄時(shí)累加金額CREATETRIGGERins_sumBEFOREINSERTONaccountFOREACHROWSET@sum=@sum+NEW.amount;DROPTRIGGERins_sum;7.8預(yù)處理SQLprepare預(yù)處理:指將SQL語(yǔ)句中的關(guān)鍵字和數(shù)據(jù)分離,對(duì)固定SQL語(yǔ)句中只進(jìn)行一次解析或查詢計(jì)劃生成,這樣在數(shù)據(jù)不同但SQL語(yǔ)句相同的情況下,執(zhí)行性能會(huì)顯著提升。PREPAREstmt_nameFROMpreparable_stmtEXECUTEstmt_name[USING@var_name[,@var_name]...]{DEALLOCATE|DROP}PREPAREstmt_name7.8預(yù)處理SQLmysql>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 交通隔離設(shè)施合同范本
- 叉車低價(jià)采購(gòu)合同范本
- 廚房廚子購(gòu)買合同范本
- 臺(tái)球售后維修合同范例
- 分期付款房子合同范本
- 農(nóng)村股權(quán)合作合同范本
- 入股合同范本合伙協(xié)議
- 2025年滄州航空職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)完整版
- 科技發(fā)展中領(lǐng)導(dǎo)者的角色定位
- 心理健康游戲教學(xué)
- 計(jì)算機(jī)網(wǎng)絡(luò)試題及答案
- 2025年安徽馬鞍山市兩山綠色生態(tài)環(huán)境建設(shè)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 人效管理措施
- 四年級(jí)下冊(cè)勞動(dòng)《小小快遞站》課件
- 籃球教練職業(yè)生涯規(guī)劃
- 機(jī)器人手術(shù)后期護(hù)理
- 食品抽檢核查處置重點(diǎn)安全性指標(biāo)不合格原因分析排查手冊(cè)
- 自力式調(diào)節(jié)閥閥門
- 《學(xué)生檔案信息管理系統(tǒng)的開發(fā)》6500字(論文)
- GB/T 44904-2024售后服務(wù)無理由退貨服務(wù)規(guī)范
- 《股市的基礎(chǔ)常識(shí)》課件
評(píng)論
0/150
提交評(píng)論