版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章存儲(chǔ)過(guò)程主要內(nèi)容10.1存儲(chǔ)過(guò)程概述10.2創(chuàng)建存儲(chǔ)過(guò)程10.3調(diào)用存儲(chǔ)過(guò)程
10.4查看存儲(chǔ)過(guò)程10.5修改存儲(chǔ)過(guò)程10.6刪除存儲(chǔ)過(guò)程10.7常量和變量10.8流程控制語(yǔ)句10.9錯(cuò)誤處理10.10游標(biāo)10.11本章小結(jié)10.1存儲(chǔ)過(guò)程概述將多條SQL命令組合在一起形成一個(gè)程序一次性執(zhí)行,我們稱(chēng)之為存儲(chǔ)程序。存儲(chǔ)程序包括存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù),它們是在數(shù)據(jù)庫(kù)中定義的一些SQL語(yǔ)句的集合,可以直接調(diào)用這些存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)來(lái)執(zhí)行已經(jīng)定義好的SQL語(yǔ)句。存儲(chǔ)過(guò)程是存放在數(shù)據(jù)庫(kù)中的一段程序,是數(shù)據(jù)庫(kù)的對(duì)象之一。它由聲明式的SQL語(yǔ)句(如DDL語(yǔ)句、DML語(yǔ)句)和過(guò)程式的SQL語(yǔ)句(如選擇語(yǔ)句、循環(huán)語(yǔ)句)組成。10.1存儲(chǔ)過(guò)程概述存儲(chǔ)過(guò)程通常有如下優(yōu)點(diǎn):封裝性:在程序中多次調(diào)用,而不必重新編寫(xiě)該存儲(chǔ)過(guò)程的SQL語(yǔ)句,并且可以隨時(shí)對(duì)存儲(chǔ)過(guò)程的特性進(jìn)行修改,而不會(huì)影響到調(diào)用該存儲(chǔ)過(guò)程的應(yīng)用程序源代碼。增強(qiáng)SQL語(yǔ)句的功能和靈活性:可以用流程控制語(yǔ)句來(lái)完成一些復(fù)雜的判斷或計(jì)算,有很強(qiáng)的靈活性。減少網(wǎng)絡(luò)傳輸:存儲(chǔ)過(guò)程是在服務(wù)器中存儲(chǔ)和運(yùn)行的,當(dāng)客戶(hù)端調(diào)用存儲(chǔ)過(guò)程時(shí),只需要從客戶(hù)端或應(yīng)用程序傳遞給數(shù)據(jù)庫(kù)必要的參數(shù)即可,網(wǎng)絡(luò)中傳輸?shù)闹皇窍鄳?yīng)的調(diào)用語(yǔ)句。提高數(shù)據(jù)的安全性:對(duì)一些重要的表我們可以禁止客戶(hù)端訪(fǎng)問(wèn),只把相關(guān)存儲(chǔ)過(guò)程的創(chuàng)建權(quán)限或者調(diào)用權(quán)限賦予必要的用戶(hù),從而防止了對(duì)表的誤操作。10.2創(chuàng)建存儲(chǔ)過(guò)程10.2.1使用命令創(chuàng)建存儲(chǔ)過(guò)程語(yǔ)法格式:CREATEPROCEDURE[IFNOTEXISTS]sp_name([proc_parameter[,…]])[characteristic…]routine_body10.2創(chuàng)建存儲(chǔ)過(guò)程10.2.1使用命令創(chuàng)建存儲(chǔ)過(guò)程其中:proc_parameter:表示存儲(chǔ)過(guò)程的參數(shù)列表,它由三部分組成,形式為[IN|OUT|INOUT]param_nametype。characteristic:指定存儲(chǔ)過(guò)程的特性,有以下5個(gè)取值。LANGUAGESQL[NOT]DETERMINISTIC{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
SQLSECURITY{DEFINER|INVOKER}
COMMENT'string'10.2創(chuàng)建存儲(chǔ)過(guò)程10.2.1使用命令創(chuàng)建存儲(chǔ)過(guò)程在定義存儲(chǔ)過(guò)程之前,應(yīng)該先使用DELIMITER關(guān)鍵字更改結(jié)束標(biāo)記。結(jié)束標(biāo)記可以是一個(gè)字符,也可以是多個(gè)字符,如“$”、“##”等。程序執(zhí)行完后,考慮到用戶(hù)使用SQL命令的習(xí)慣性,一般要將結(jié)束標(biāo)記再恢復(fù)成默認(rèn)的分號(hào)。DELIMITER關(guān)鍵字和后面的結(jié)束標(biāo)記中間一定要有空格。10.2創(chuàng)建存儲(chǔ)過(guò)程10.2.1使用命令創(chuàng)建存儲(chǔ)過(guò)程【例10.2】創(chuàng)建存儲(chǔ)過(guò)程,可以根據(jù)學(xué)號(hào)查詢(xún)學(xué)生的相關(guān)信息。在MySQL命令行客戶(hù)端輸入命令:
DELIMITER//CREATEPROCEDUREselect_student(INp_snoCHAR(11))BEGINSELECT*FROMstudentWHEREsno=p_sno;END//DELIMITER;10.2創(chuàng)建存儲(chǔ)過(guò)程10.2.1使用命令創(chuàng)建存儲(chǔ)過(guò)程【例10.3】創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,根據(jù)學(xué)號(hào)查詢(xún)并輸出學(xué)生的姓名和專(zhuān)業(yè)號(hào)。在MySQL命令行客戶(hù)端輸入命令:
DELIMITER//CREATEPROCEDUREselect_stu(INp_snoCHAR(11),OUTp_snameVARCHAR(10),OUTp_mnoCHAR(4))BEGINSELECTsname,mnoINTOp_sname,p_mnoFROMstudentWHEREsno=p_sno;END//DELIMITER;10.2創(chuàng)建存儲(chǔ)過(guò)程10.2.2使用圖形化工具創(chuàng)建存儲(chǔ)過(guò)程打開(kāi)Workbench工具,連接到MySQL服務(wù)器。選中“Schemas”,打開(kāi)“jwgl”數(shù)據(jù)庫(kù),找到“StoredProcedures”選項(xiàng),右鍵單擊“CreateStoredProcedure…”,或者單擊圖標(biāo)。10.2創(chuàng)建存儲(chǔ)過(guò)程10.2.2使用圖形化工具創(chuàng)建存儲(chǔ)過(guò)程在界面中填寫(xiě)相應(yīng)的存儲(chǔ)過(guò)程代碼(注意:在該界面中不需要輸入DELIMITER語(yǔ)句),然后單擊“Apply”,此時(shí)出現(xiàn)查看存儲(chǔ)過(guò)程的SQL腳本的界面。確認(rèn)無(wú)誤后單擊右下角的“Apply”,在出現(xiàn)的界面中單擊“Finish”,此時(shí)存儲(chǔ)過(guò)程創(chuàng)建成功。10.3調(diào)用存儲(chǔ)過(guò)程10.3.1使用命令調(diào)用存儲(chǔ)過(guò)程
語(yǔ)法格式:CALLsp_name([proc_parameter[,…]])【例10.4】調(diào)用存儲(chǔ)過(guò)程select_student和select_stu。
在MySQL命令行客戶(hù)端輸入命令:CALLselect_student('20190101001');CALLselect_stu('20190101001',@sname,@mno);SELECT@sname,@mno;10.3調(diào)用存儲(chǔ)過(guò)程10.3.2使用圖形化工具調(diào)用存儲(chǔ)過(guò)程
(1)打開(kāi)Workbench工具,連接到MySQL服務(wù)器。(2)選中“Schemas”標(biāo)簽,打開(kāi)“jwgl”數(shù)據(jù)庫(kù),在“StoredProcedures”下找到想要調(diào)用的存儲(chǔ)過(guò)程名稱(chēng),如select_stu,單擊其右側(cè)的圖標(biāo),此時(shí)出現(xiàn)調(diào)用存儲(chǔ)過(guò)程的界面,如圖所示。(3)在文本框中依次輸入?yún)?shù)值,如'20190101001'、@sname、@mno,然后單擊“Execute”,此時(shí)出現(xiàn)調(diào)用結(jié)果界面。
10.4查看存儲(chǔ)過(guò)程10.4.1SHOWSTATUS語(yǔ)句可以使用SHOWSTATUS語(yǔ)句查看存儲(chǔ)過(guò)程的特征。語(yǔ)法格式:SHOWPROCEDURE|FUNCTIONSTATUS[LIKE'pattern’]【例10.5】查看名字以“select”開(kāi)頭的存儲(chǔ)過(guò)程的特征。在MySQL命令行客戶(hù)端輸入命令:SHOWPROCEDURESTATUSLIKE'select%’\G10.4查看存儲(chǔ)過(guò)程10.4.2SHOWCREATE語(yǔ)句可以使用SHOWCREATE語(yǔ)句查看存儲(chǔ)過(guò)程或者存儲(chǔ)函數(shù)的狀態(tài)和當(dāng)前的定義語(yǔ)句。語(yǔ)法格式:SHOWCREATEPROCEDUREsp_name【例10.6】查看存儲(chǔ)過(guò)程select_stu的定義。在MySQL命令行客戶(hù)端輸入命令:SHOWCREATEPROCEDUREselect_stu\G10.4查看存儲(chǔ)過(guò)程10.4.3查詢(xún)r(jià)outines表可以通過(guò)查詢(xún)r(jià)outines表中的記錄來(lái)獲取存儲(chǔ)過(guò)程和函數(shù)的信息。
【例10.7】從routines表中查詢(xún)存儲(chǔ)過(guò)程select_student的信息。在MySQL命令行客戶(hù)端輸入命令:SELECT*FROMinformation_schema.routinesWHEREroutine_name='select_student'ANDroutine_type='PROCEDURE'\G10.4查看存儲(chǔ)過(guò)程10.4.4使用圖形化工具查看存儲(chǔ)過(guò)程(1)打開(kāi)Workbench工具,連接到MySQL服務(wù)器。(2)選中“Schemas”標(biāo)簽下的“jwgl”數(shù)據(jù)庫(kù),然后單擊工具欄的圖標(biāo),或者單擊“jwgl”數(shù)據(jù)庫(kù)后面的圖標(biāo)。(3)單擊“StoredProcedures”標(biāo)簽,進(jìn)入如圖所示界面,可以看到操作jwgl數(shù)據(jù)庫(kù)的所有存儲(chǔ)過(guò)程的特征信息。10.5修改存儲(chǔ)過(guò)程10.5.1使用命令修改存儲(chǔ)過(guò)程使用ALTERPROCEDURE語(yǔ)句可以修改存儲(chǔ)過(guò)程的特性,但不能修改存儲(chǔ)過(guò)程的參數(shù)和過(guò)程體定義語(yǔ)句。語(yǔ)法格式:ALTERPROCEDUREsp_name[characteristic…]10.6刪除存儲(chǔ)過(guò)程10.6.1使用命令刪除存儲(chǔ)過(guò)程語(yǔ)法格式:
DROPPROCEDURE[IFEXISTS]sp_name【例10.9】刪除存儲(chǔ)過(guò)程select_stu。在MySQL命令行客戶(hù)端輸入命令:DROPPROCEDUREselect_stu;10.6刪除存儲(chǔ)過(guò)程10.6.2使用圖形化工具刪除存儲(chǔ)過(guò)程(1)打開(kāi)Workbench工具,連接到MySQL服務(wù)器。(2)打開(kāi)“StoredProcedures”可以看到操作當(dāng)前數(shù)據(jù)庫(kù)的所有存儲(chǔ)過(guò)程,選中你想要?jiǎng)h除的存儲(chǔ)過(guò)程名稱(chēng),如:select_student,右鍵單擊“DropStoredProcedure…”選項(xiàng),彈出如圖所示界面。(3)在該彈出的對(duì)話(huà)框中,“ReviewSQL”選項(xiàng)可以看到刪除該存儲(chǔ)過(guò)程的SQL代碼,然后再單擊“Execute”即可完成刪除操作;或者在所示界面中單擊“DropNow”選項(xiàng),即可直接刪除該存儲(chǔ)過(guò)程。10.7常量和變量10.7.1常量字符串常量:用單引號(hào)或者雙引號(hào)標(biāo)注起來(lái)的字符序列,薦使用單引號(hào)作為字符串的定界符。數(shù)值常量:包括整數(shù)常量和浮點(diǎn)數(shù)常量。日期時(shí)間常量:本質(zhì)上是一個(gè)符合特殊格式的字符串常量,是指用單引號(hào)將表示日期時(shí)間的字符串標(biāo)注起來(lái)構(gòu)成的。布爾常量:包含TRUE和FALSE兩個(gè)值。二進(jìn)制常量:前綴“b”后面跟一個(gè)二進(jìn)制字符串,如b'111101'。十六進(jìn)制常量:前綴是“X”或者“0x”,后面跟一個(gè)十六進(jìn)制字符串,如0x'4D7953514C'。NULL值:表示“沒(méi)有值”、“值不確定”等含義。10.7常量和變量10.7.2變量會(huì)話(huà)變量:以“@”作為起始字符,不區(qū)分大小寫(xiě),在整個(gè)會(huì)話(huà)過(guò)程中都有效,表現(xiàn)形式如@name、@b等。局部變量:使用關(guān)鍵字DECLARE聲明,后面跟變量名稱(chēng)和數(shù)據(jù)類(lèi)型,也可以用關(guān)鍵字DEFAULT為變量指定默認(rèn)值,如
DECLAREidINT;系統(tǒng)變量:以“@@”開(kāi)頭,根據(jù)其作用范圍可分為全局級(jí)(GLOBAL)和會(huì)話(huà)級(jí)(SESSION),前者是對(duì)整個(gè)MySQL服務(wù)器生效,后者只對(duì)當(dāng)前連接的客戶(hù)端會(huì)話(huà)生效。10.7常量和變量10.7.2變量給用戶(hù)變量賦值(1)用SET語(yǔ)句給會(huì)話(huà)變量或局部變量賦值
語(yǔ)法格式如下:SETvar_name=exper[,var_name=exper]【例10.10】用SET語(yǔ)句給會(huì)話(huà)變量賦值并查看其值。在MySQL命令行客戶(hù)端輸入命令:SET@name='努力學(xué)習(xí)';SET@a=(SELECTsnameFROMstudentWHEREsno='20190101001');SELECT@name,@a;10.7常量和變量10.7.2變量給用戶(hù)變量賦值(2)用SELECT...INTO語(yǔ)句給會(huì)話(huà)變量和局部變量賦值
語(yǔ)法格式如下:SELECTcol_name[,...]INTOvar_name[,...]FROMtableWHEREcondition【例10.11】用SELECT...INTO語(yǔ)句給會(huì)話(huà)變量賦值并查看其值。在MySQL命令行客戶(hù)端輸入命令:SELECTsnameinto@naFROMstudentWHEREsno='20190101001';SELECT@na;10.7常量和變量10.7.2變量給用戶(hù)變量賦值(3)用SELECT關(guān)鍵字給變量賦值
語(yǔ)法格式如下:SELECTvar_name:=exper如:SELECT@name:='數(shù)據(jù)庫(kù)編程’;
注意:此時(shí)的賦值符號(hào)是冒號(hào)和等號(hào)“:=”。一般不推薦使用這種賦值語(yǔ)句,建議使用SET語(yǔ)句和SELECT...INTO語(yǔ)句這兩種方式給用戶(hù)變量賦值。10.8流程控制語(yǔ)句10.8.1條件語(yǔ)句(1)IF語(yǔ)句語(yǔ)法格式:IFsearch_conditionTHENstatement_list[ELSEIFsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDIF10.8流程控制語(yǔ)句10.8.1條件語(yǔ)句(1)IF語(yǔ)句【例10.13】創(chuàng)建存儲(chǔ)過(guò)程,輸入兩個(gè)數(shù),輸出較大的數(shù)。
在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREpro_max(INp_aINT,INp_bINT,OUTp_outINT)BEGINIFp_a>p_bTHENSETp_out=p_a;ELSESETp_out=p_b;ENDIF;END//DELIMITER;調(diào)用存儲(chǔ)過(guò)程:CALLpro_max(3,5,@c);SELECT@c;10.8流程控制語(yǔ)句10.8.1條件語(yǔ)句(2)CASE語(yǔ)句語(yǔ)法格式一:CASEcase_value WHENwhen_valueTHENstatement_list [WHENwhen_valueTHENstatement_list]... [ELSEstatement_list]ENDCASE語(yǔ)法格式二:CASE WHENsearch_conditionTHENstatement_list [WHENsearch_conditionTHENstatement_list]... [ELSEstatement_list]ENDCASE10.8流程控制語(yǔ)句10.8.1條件語(yǔ)句(2)CASE語(yǔ)句【例10.14】創(chuàng)建存儲(chǔ)過(guò)程,輸入一個(gè)數(shù),判斷該數(shù)對(duì)應(yīng)的是星期幾。在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREpro_week(INp_nuINT,OUTp_weekCHAR(3))BEGINCASEp_nuWHEN1THENSETp_week='星期日';WHEN2THENSETp_week='星期一';WHEN3THENSETp_week='星期二';WHEN4THENSETp_week='星期三';
WHEN5THENSETp_week='星期四';WHEN6THENSETp_week='星期五’;WHEN7THENSETp_week='星期六’;ELSESETp_week='錯(cuò)誤’;ENDCASE;END//DELIMITER;調(diào)用存儲(chǔ)過(guò)程:CALLpro_week(3,@week);SELECT@week;10.8流程控制語(yǔ)句10.8.2循環(huán)語(yǔ)句(1)WHILE語(yǔ)句
語(yǔ)法格式:[label:]WHILEsearch_conditionDOstatement_listENDWHILE[label]【例10.15】創(chuàng)建存儲(chǔ)過(guò)程,計(jì)算1+2+3+…+100的值。在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREpro_while(OUTp_outINT)BEGINDECLAREiINTDEFAULT1;SETp_out=0;
WHILEi<=100DOSETp_out=p_out+i;SETi=i+1;ENDWHILE;END//DELIMITER;調(diào)用存儲(chǔ)過(guò)程:CALLpro_while(@c);SELECT@c;10.8流程控制語(yǔ)句10.8.2循環(huán)語(yǔ)句(2)LOOP語(yǔ)句
語(yǔ)法格式:[label:]LOOP statement_listENDLOOP[label]【例10.16】創(chuàng)建存儲(chǔ)過(guò)程,計(jì)算1+2+3+…+100的值。在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREpro_loop(OUTp_outINT)BEGINDECLAREiINTDEFAULT1;SETp_out=0;label:LOOPIFi>100THENLEAVElabel;ENDIF;SETp_out=p_out+i;SETi=i+1;ENDLOOP;END//DELIMITER;調(diào)用存儲(chǔ)過(guò)程:CALLpro_loop(@d);SELECT@d;10.8流程控制語(yǔ)句10.8.2循環(huán)語(yǔ)句(3)REPEAT語(yǔ)句
語(yǔ)法格式:[label:]REPEAT statement_list UNTILsearch_conditionENDREPEAT[label]【例10.17】創(chuàng)建存儲(chǔ)過(guò)程,計(jì)算1+2+3+…+100的值。在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREpro_repeat(OUTp_outINT)BEGINDECLAREiINTDEFAULT1;SETp_out=0;
REPEATSETp_out=p_out+i;SETi=i+1;UNTILi>100ENDREPEAT;END//DELIMITER;調(diào)用存儲(chǔ)過(guò)程:CALLpro_repeat(@e);SELECT@e;10.9錯(cuò)誤處理10.9.1可能出現(xiàn)的錯(cuò)誤【例10.18】創(chuàng)建存儲(chǔ)過(guò)程,向student表中插入學(xué)生記錄。在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREinsert_student(INp_snoCHAR(11),INp_snameVARCHAR(10))BEGININSERTINTOstudent(sno,sname)VALUES(p_sno,p_sname);END//DELIMITER;該存儲(chǔ)過(guò)程創(chuàng)建完成后,我們用相同的參數(shù)連著兩次調(diào)用該存儲(chǔ)過(guò)程:CALLinsert_student('1111','張三');CALLinsert_student('1111','張三');10.9錯(cuò)誤處理10.9.2定義錯(cuò)誤處理可以使用DECLARE…HANDLER語(yǔ)句來(lái)定義錯(cuò)誤處理代碼段,其語(yǔ)法格式如下所示:DECLAREhandler_actionHANDLERFORcondition_value[,condition_value]...Statement其中handler_action指示處理程序在執(zhí)行處理語(yǔ)句后采取的操作,它有三個(gè)取值CONTINUE、EXIT和UNDO。10.9錯(cuò)誤處理10.9.2定義錯(cuò)誤處理【例10.19】創(chuàng)建存儲(chǔ)過(guò)程,向student表中插入學(xué)生記錄,并進(jìn)行相應(yīng)的錯(cuò)誤處理。在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREinsert_stu(INp_snoCHAR(11),INp_snameVARCHAR(10),INp_mnoCHAR(4),OUTp_out_noINT,OUTp_out_msgVARCHAR(20))BEGINDECLAREEXITHANDLERFOR1062BEGINSETp_out_no=-1;SETp_out_msg='學(xué)號(hào)重復(fù)';END;DECLAREEXITHANDLERFOR1452BEGINSETp_out_no=-2;SETp_out_msg='專(zhuān)業(yè)代碼錯(cuò)誤';END;INSERTINTOstudent(sno,sname,mno)VALUES(p_sno,p_sname,p_mno);SETp_out_no=0;SETp_out_msg='添加成功';END//DELIMITER;10.9錯(cuò)誤處理10.9.2定義錯(cuò)誤處理三次調(diào)用該存儲(chǔ)過(guò)程:CALLinsert_stu('2222','李四','0701',@result_no,@result_msg);SELECT@result_no,@result_msg;CALLinsert_stu('2222','李四','0701',@result_no,@result_msg);SELECT@result_no,@result_msg;CALLinsert_stu('3333','王五','666',@result_no,@result_msg);SELECT@result_no,@result_msg;10.9錯(cuò)誤處理10.9.3自定義錯(cuò)誤條件語(yǔ)法格式:DECLAREcondition_nameCONDITIONFORcondition_valueDECLAREforeign_key_errorCONDITIONFOR1452;此時(shí)可以將“1452”的錯(cuò)誤處理寫(xiě)成如下代碼:DECLAREEXITHANDLERFORforeign_key_errorBEGINSETp_out_no=-2;SETp_out_msg='專(zhuān)業(yè)代碼錯(cuò)誤';END;10.10游標(biāo)10.10.1游標(biāo)的概念在存儲(chǔ)過(guò)程中,如果想把表中查詢(xún)到的結(jié)果存放到變量中,可以通過(guò)SELECT…INTO語(yǔ)句完成。但SELECT…INTO語(yǔ)句是有局限性的,它只能把查詢(xún)到的一條數(shù)據(jù)存放到變量中,如果SELECT查詢(xún)到多行數(shù)據(jù)結(jié)果,那么程序會(huì)報(bào)錯(cuò)。游標(biāo)本質(zhì)上是一種能從包括多條數(shù)據(jù)記錄的SELECT結(jié)果集中每次提取一條記錄的機(jī)制,它的作用類(lèi)似于C語(yǔ)言中的指針,一次只能指向內(nèi)存中存放的結(jié)果集中的一行,通過(guò)控制游標(biāo)的移動(dòng),我們能夠遍歷結(jié)果集中的每一行。10.10游標(biāo)10.10.2游標(biāo)的使用游標(biāo)的使用包括四個(gè)步驟,分別是聲明游標(biāo)、打開(kāi)游標(biāo)、獲取數(shù)據(jù)和關(guān)閉游標(biāo)。(1)聲明游標(biāo)語(yǔ)法格式:DECLAREcursor_nameCURSORFORselect_statement注意:SELECT語(yǔ)句不能帶INTO子句。此時(shí)只是聲明了游標(biāo),與它關(guān)聯(lián)的SELECT語(yǔ)句還沒(méi)有執(zhí)行,服務(wù)器的內(nèi)存中并不存在與SELECT語(yǔ)句對(duì)應(yīng)的結(jié)果集。
10.10游標(biāo)10.10.2游標(biāo)的使用(2)打開(kāi)游標(biāo)語(yǔ)法格式:OPENcursor_name說(shuō)明:打開(kāi)游標(biāo)后,對(duì)應(yīng)的SELECT語(yǔ)句執(zhí)行,查詢(xún)到的結(jié)果集存放在MySQL服務(wù)器的內(nèi)存中。
10.10游標(biāo)10.10.2游標(biāo)的使用(3)獲取數(shù)據(jù)語(yǔ)法格式:FETCH[[NEXT]FROM]cursor_nameINTOvar_name[,var_name]…說(shuō)明:第一次執(zhí)行FETCH語(yǔ)句時(shí),從結(jié)果集中提取第一條記錄,然后游標(biāo)指針后移一行,以此類(lèi)推。當(dāng)成功提取最后一行記錄后,指針再次后移,指向最后一條記錄的后面,這時(shí)再次執(zhí)行該FETCH語(yǔ)句,將產(chǎn)生ERROR1329(02000)錯(cuò)誤,可以針對(duì)錯(cuò)誤代碼1329或者NOTFOUND定義錯(cuò)誤處理代碼,以便結(jié)束游標(biāo)循環(huán),正常執(zhí)行程序。
10.10游標(biāo)10.10.2游標(biāo)的使用(4)關(guān)閉游標(biāo)語(yǔ)法格式:CLOSEcursor_name10.10游標(biāo)10.10.2游標(biāo)的使用【例10.20】創(chuàng)建存儲(chǔ)過(guò)程,利用游標(biāo)讀取student表中總?cè)藬?shù),該功能可以使用COUNT()函數(shù)直接完成,此實(shí)例主要為演示游標(biāo)的使用方法。在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREstudent_count(OUTp_numINT)BEGINDECLAREv_snoCHAR(11);DECLAREfinishBOOLEANDEFAULTFALSE;DECLAREcur_stuCURSORFORSELECTsnoFROMstudent;DECLARECONTINUEHANDLERFORNOTFOUNDSETfinish=TRUE;10.10游標(biāo)10.10.2游標(biāo)的使用SETp_num=0;OPENcur_stu;count_loop:LOOPFETCHcur_stuINTOv_sno;IFfinishTHENLEAVEcount_loop;ENDIF;SETp_num=p_num+1;ENDLOOP;CLOSEcur_stu;END//DELIMITER;調(diào)用該存儲(chǔ)過(guò)程:CALLstudent_count(@a);SELECT@a;10.10游標(biāo)10.10.2游標(biāo)的使用【例10.21】創(chuàng)建存儲(chǔ)過(guò)程,根據(jù)給定的課程名稱(chēng),利用游標(biāo)查詢(xún)并輸出選修該門(mén)課程的學(xué)生學(xué)號(hào)及成績(jī)。在MySQL命令行客戶(hù)端輸入命令:DELIMITER//CREATEPROCEDUREcourse_score(INp_cnameVARCHAR(10),OUTp_snoCHAR(11),OUTp_gradeTINYINT)BEGINDECLAREflagBOOLEANDEFAULTTRUE;DECLAREcur_scoreCURSORFORSELECTsno,gradeFROMscoreWHEREcno=(SELECTcnoFROMcourseWHEREcname=p_cname);10.10游標(biāo)1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中安全知識(shí)題庫(kù)及答案
- 2026年數(shù)據(jù)分析師面試中常見(jiàn)的用戶(hù)行為分析面試題及答案解析
- 事故追償權(quán)益轉(zhuǎn)讓協(xié)議書(shū)
- 小組成立書(shū)面協(xié)議書(shū)
- 花店同城配送協(xié)議書(shū)怎么寫(xiě)
- 景區(qū)劇本合作協(xié)議書(shū)
- 個(gè)體化治療時(shí)序優(yōu)化的精準(zhǔn)醫(yī)療遠(yuǎn)程會(huì)診時(shí)機(jī)決策
- 兒科常見(jiàn)病護(hù)理與康復(fù)護(hù)理
- 內(nèi)分泌疾病營(yíng)養(yǎng)治療新策略
- 2026年文化傳媒公司面試題庫(kù)及答案
- 2026年湖南中醫(yī)藥高等專(zhuān)科學(xué)校單招職業(yè)技能測(cè)試題庫(kù)新版
- 駿馬奔騰啟新程盛世華章譜未來(lái)-2026年馬年學(xué)校元旦主持詞
- 剪刀式登高車(chē)專(zhuān)項(xiàng)施工方案
- 22863中級(jí)財(cái)務(wù)會(huì)計(jì)(一)機(jī)考綜合復(fù)習(xí)題
- 安慶師范學(xué)院論文格式
- 專(zhuān)業(yè)技術(shù)指導(dǎo)委員會(huì)工作總結(jié)報(bào)告
- 2025-2030智慧消防系統(tǒng)遠(yuǎn)程監(jiān)控平臺(tái)與城市火災(zāi)防控效果規(guī)劃研究
- 醫(yī)療器械經(jīng)營(yíng)企業(yè)培訓(xùn)試卷及答案
- 27米三角形屋架設(shè)計(jì)
- 2025年大學(xué)《老撾語(yǔ)》專(zhuān)業(yè)題庫(kù)-老
- 看守所急救知識(shí)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論