項(xiàng)目8--認(rèn)識MySQL的存儲過程_第1頁
項(xiàng)目8--認(rèn)識MySQL的存儲過程_第2頁
項(xiàng)目8--認(rèn)識MySQL的存儲過程_第3頁
項(xiàng)目8--認(rèn)識MySQL的存儲過程_第4頁
項(xiàng)目8--認(rèn)識MySQL的存儲過程_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、任務(wù)1 初識MySQL存儲過程項(xiàng)目8 認(rèn)識MySQL的存儲過程任務(wù)2 錯誤觸發(fā)條件和錯誤處理程序任務(wù)3 MySQL數(shù)據(jù)庫中的游標(biāo)任務(wù)4 使用預(yù)處理SQL語句存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來調(diào)用執(zhí)行它。任務(wù)1 初識MySQL存儲過程了解并創(chuàng)建存儲過程MySQL數(shù)據(jù)庫中的存儲過程和函數(shù)中允許包含DDL(Data Definition Language數(shù)據(jù)庫模式定義語言,是用于描述數(shù)據(jù)庫中要存儲的現(xiàn)實(shí)世界實(shí)體的語言)語句,也允許在存儲過程中執(zhí)行提交(commit,

2、即確認(rèn)之前的修改)或者回滾(rollback,即放棄之前的修改),但是存儲過程和函數(shù)中不允許執(zhí)行LOAD DATA INFILE 語句。此外,存儲過程和函數(shù)中可以調(diào)用其他存儲過程或者函數(shù)。任務(wù)1 初識MySQL存儲過程了解并創(chuàng)建存儲過程存儲過程的優(yōu)點(diǎn):(1)增強(qiáng)SQL語言的功能和靈活性。(2)標(biāo)準(zhǔn)組件式編程。(3)較快的執(zhí)行速度。(4)減少網(wǎng)絡(luò)流量。(5)作為一種安全機(jī)制來充分利用。任務(wù)1 初識MySQL存儲過程了解并創(chuàng)建存儲過程MySQL存儲過程的創(chuàng)建語法:CREATE PROCEDURE 過程名(IN|OUT|INOUT 參數(shù)名 數(shù)據(jù)類型 ,IN|OUT|INOUT 參數(shù)名 數(shù)據(jù)類型)特性

3、.過程體例如:DELIMITER /CREATE PROCEDURE myproc(OUT s int)BEGINSELECT COUNT(*) INTO s FROM students;END /DELIMITER ;任務(wù)1 初識MySQL存儲過程了解并創(chuàng)建存儲過程MySQL數(shù)據(jù)庫默認(rèn)以;為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當(dāng)成SQL語句進(jìn)行處理,編譯過程會報錯。所以要事先用“DELIMITER /”語句修改當(dāng)前段分隔符為“/”,也就是說,此語句之后的所有語句以“/”作為分隔符,讓編譯器把第一次出現(xiàn)的“/”和第二次出現(xiàn)的“/”之間的全部內(nèi)容當(dāng)做存儲過程的代碼,不會執(zhí)行這些代碼。

4、而后面的“DELIMITER ;”意為把分隔符還原為默認(rèn)的“;”(注意在DELIMITER與;之間要有一個空格)。任務(wù)1 初識MySQL存儲過程了解并創(chuàng)建存儲過程存儲過程的參數(shù)類型:IN:表示該參數(shù)值必須在調(diào)用存儲過程時指定,在存儲過程中這個值是不能被返回的。OUT:表示該參數(shù)的值可以被存儲過程改變,并且可以返回。INOUT:表示該參數(shù)在調(diào)用時指定,并且可以被改變和返回。任務(wù)1 初識MySQL存儲過程了解并創(chuàng)建存儲過程存儲過程的過程體開始與結(jié)束使用BEGIN與END進(jìn)行標(biāo)識。舉例如下:【例8-1】in參數(shù)實(shí)例MySQL DELIMITER / - 修改結(jié)束符MySQL CREATE PROCE

5、DURE demo(IN p_in int) - 定義帶參數(shù)的存儲過程- BEGIN - SELECT p_in; - SET p_in=2; - SELECT p_in; - END; - / MySQL DELIMITER ;任務(wù)1 初識MySQL存儲過程了解并創(chuàng)建存儲過程調(diào)用存儲過程需要用call命令和存儲過程名以及一個括號,括號里面根據(jù)需要,加入?yún)?shù),參數(shù)包括輸入?yún)?shù)、輸出參數(shù)、輸入輸出參數(shù)。具體的調(diào)用方法可以參看下面例子。例如:call proc_name()- 無參數(shù)call proc_name(1,2)- 有參數(shù),參數(shù)全為in(默認(rèn)值)DECLARE t1 INT;- 有參數(shù),有

6、in,out,inoutDECLARE t2 INT default 3;call proc_name(1,2,t1,t2)任務(wù)1 初識MySQL存儲過程存儲過程調(diào)用【例8-2】調(diào)用例8-1創(chuàng)建的名為demo的存儲過程。任務(wù)1 初識MySQL存儲過程存儲過程調(diào)用MySQL SET p_in=1; MySQL CALL demo(p_in); +-+ | p_in | +-+ | 1 | +-+ +-+ | p_in | +-+ | 2 | +-+ MySQL SELECT p_in; +-+ | p_in | +-+ | 1 | +-+在例8-2中,先是創(chuàng)建了一個名為demo的存儲過程,該存儲

7、過程有一個參數(shù)為p_in,這個參數(shù)是int類型,代表了一個整數(shù),并且前面由IN來修飾,說明該參數(shù)在存儲過程執(zhí)行過程中,不能作為返回值。在調(diào)用demo存儲過程執(zhí)行之前,先設(shè)定了變量p_in的值為1,然后調(diào)用了存儲過程demo,而該存儲過程的內(nèi)容就是修改并顯示p_in的值,因此在輸出段看到出現(xiàn)了兩次p_in的值,第一次是存儲過程剛開始執(zhí)行時第一條語句的結(jié)果,顯示p_in的值;第二次是存儲過程中第三條語句的結(jié)果,顯示了p_in被修改之后的新值。當(dāng)存儲過程執(zhí)行完畢,又一次調(diào)用 p_in變量的值,發(fā)現(xiàn)該變量的值仍然是1,這是因?yàn)閐emo存儲過程在設(shè)定參數(shù)的時候已經(jīng)確定了參數(shù)為IN,因此無論存儲過程內(nèi)部如

8、何對p_in變量進(jìn)行修改,一旦存儲過程退出,p_in變量的值都將恢復(fù)到存儲過程執(zhí)行之前的狀態(tài)。任務(wù)1 初識MySQL存儲過程存儲過程調(diào)用【例8-3】創(chuàng)建demo_out_parameter存儲過程,參數(shù)采用OUT類型。任務(wù)1 初識MySQL存儲過程存儲過程調(diào)用MySQL DELIMITER / MySQL CREATE PROCEDURE demo_out_parameter(OUT p_out int) - BEGIN - SELECT p_out; - SET p_out=2; - SELECT p_out; - END; - / MySQL DELIMITER ;執(zhí)行結(jié)果:MySQL S

9、ET p_out=1; MySQL CALL sp_demo_out_parameter(p_out); +-+ | p_out | +-+ | NULL | +-+ +-+ | p_out | +-+ | 2 | +-+ MySQL SELECT p_out; +-+ | p_out | +-+ | 2 | +-+【例8-4】創(chuàng)建demo_out_parameter存儲過程,參數(shù)采用INOUT類型。任務(wù)1 初識MySQL存儲過程存儲過程調(diào)用MySQL DELIMITER / MySQL CREATE PROCEDURE demo_inout_parameter(INOUT p_inout i

10、nt) - BEGIN - SELECT p_inout; - SET p_inout=2; - SELECT p_inout; - END; - / MySQL DELIMITER ;執(zhí)行結(jié)果:MySQL SET p_inout=1; MySQL CALL demo_inout_parameter(p_inout) ; +-+ | p_inout | +-+ | 1 | +-+ +-+ | p_inout | +-+ | 2 | +-+ MySQL SELECT p_inout; +-+ | p_inout | +-+ | 2 | +-+在實(shí)際應(yīng)用中,要查看某個數(shù)據(jù)庫下面的存儲過程,MySQ

11、L數(shù)據(jù)庫提供了三種方法。方法一:select name from MySQL.proc where db=數(shù)據(jù)庫名,此方法只能看到存儲過程的名字而沒有詳細(xì)信息。任務(wù)1 初識MySQL存儲過程查看存儲過程【例8-5】用方法一顯示test數(shù)據(jù)庫中的存儲過程。mysql select name from c where db=test;+-+| name |+-+| p1 |+-+1 row in set (0.02 sec)方法二:select routine_name from information_schema.routines where routine_schema=數(shù)

12、據(jù)庫名。 此方法類似于方法一,只能看到存儲過程的名字而沒有詳細(xì)信息。任務(wù)1 初識MySQL存儲過程查看存儲過程【例8-6】用方法二顯示test數(shù)據(jù)庫中的存儲過程。mysql select routine_name from information_schema.routines where routine_schema=test;+-+| routine_name |+-+| p1 |+-+1 row in set (0.02 sec)方法三:show procedure status where db=數(shù)據(jù)庫名,此方法列出了較為詳細(xì)的關(guān)于存儲過程的信息,包括了創(chuàng)建時間、修改時間、字符集、校對

13、規(guī)則等。任務(wù)1 初識MySQL存儲過程查看存儲過程【例8-7】用方法三顯示test數(shù)據(jù)庫中的存儲過程。mysql show procedure status where db=test;+-+-+-+-+-+-+-| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |+-+-+-+-+-+-+-| test | p1 | PROCEDURE | test% | 2

14、019-08-09 06:53:08 | 2019-08-09 06:53:08 | DEFINER | | utf8mb4 | utf8mb4_general_ci | utf8_general_ci |+-+-+-+-+-+-+-1 row in set (0.03 sec)如果用戶想知道某個存儲過程的詳細(xì)內(nèi)容,可以采用類似于查看創(chuàng)建數(shù)據(jù)庫或數(shù)據(jù)表的命令。命令形式如下:SHOW CREATE PROCEDURE 數(shù)據(jù)庫.存儲過程名;任務(wù)1 初識MySQL存儲過程查看存儲過程【例8-8】顯示存儲過程p1的詳細(xì)內(nèi)容。mysql show create procedure p1;| Proced

15、ure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation |-+-+-+-+| p1 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=test% PROCEDURE p1()begin de

16、clare id bigint; declare name varchar(10); declare done int default false; declare mc cursor for select S_id,S_name from student; declare continue HANDLER for not found set done = true; open mc; fetch mc into id,name; select id,name; while(not done) do fetch mc into id,name; select id,name; end whil

17、e; close mc;end | utf8mb4 | utf8mb4_general_ci | utf8_general_ci |-+-+-+-+1 row in set (0.03 sec)刪除一個存儲過程比較簡單,和刪除表的命令類似。命令如:DROP PROCEDURE 數(shù)據(jù)庫.存儲過程名;【例8-9】刪除例8-8中的存儲過程p1mysql drop procedure p1;Query OK, 0 rows affected (0.03 sec)任務(wù)1 初識MySQL存儲過程刪除存儲過程主要特性區(qū)別如下: 1)一般來說,存儲過程實(shí)現(xiàn)的功能要復(fù)雜一點(diǎn),而函數(shù)的功能針對性比較強(qiáng)。存儲過程功

18、能較強(qiáng),可以執(zhí)行包括修改表等一系列數(shù)據(jù)庫操作;而用戶定義函數(shù)不能用于執(zhí)行一組修改全局?jǐn)?shù)據(jù)庫狀態(tài)的操作。 2)對于存儲過程來說可以返回參數(shù),如記錄集,而函數(shù)只能返回值或者表對象。函數(shù)只能返回一個變量;而存儲過程可以返回多個。存儲過程的參數(shù)可以有IN,OUT,INOUT三種類型,而函數(shù)只能有IN類。存儲過程聲明時不需要返回類型,而函數(shù)聲明時需要描述返回類型,且函數(shù)體中必須包含一個有效的RETURN語句。3)存儲過程一般是作為一個獨(dú)立的部分來執(zhí)行( EXECUTE 語句執(zhí)行),而函數(shù)可以作為查詢語句的一個部分來調(diào)用(SELECT調(diào)用),由于函數(shù)可以返回一個表對象,因此它可以在查詢語句中位于FROM關(guān)

19、鍵字的后面。 SQL語句中不可用存儲過程,而可以使用函數(shù)。任務(wù)1 初識MySQL存儲過程對比存儲過程與函數(shù)在操作MySQL 過程中,由于操作不當(dāng)或輸入命令的格式不當(dāng)?shù)仍?,?jīng)常會出現(xiàn)一些錯誤或警告。MySQL數(shù)據(jù)庫中已經(jīng)預(yù)定義了一組錯誤代碼,每個代碼對應(yīng)了一種特定的錯誤信息。如表8-1所示,MySQL返回的錯誤代碼可以提示用戶錯誤類型,并幫助用戶改正錯誤,用戶可以通過常用的錯誤代碼判斷錯誤原因。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解自定義錯誤處理程序任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解自定義錯誤處理程序MySQL標(biāo)準(zhǔn)錯誤代碼錯誤代碼含義1005 SQLSTATE: HY000 (ER_CAN

20、T_CREATE_TABLE) 無法創(chuàng)建表%s (errno: %d) 1006 SQLSTATE: HY000 (ER_CANT_CREATE_DB) 無法創(chuàng)建數(shù)據(jù)庫%s (errno: %d)1007 SQLSTATE: HY000 (ER_DB_CREATE_EXISTS)無法創(chuàng)建數(shù)據(jù)庫%s,數(shù)據(jù)庫已存在。1008 SQLSTATE: HY000 (ER_DB_DROP_EXISTS)無法撤銷數(shù)據(jù)庫%s,數(shù)據(jù)庫不存在。1009 SQLSTATE: HY000 (ER_DB_DROP_DELETE)撤銷數(shù)據(jù)庫時出錯(無法刪除%s,errno: %d)表8-1 部分MySQL錯誤代碼及其含義

21、說明要聲明一個處理程序,可以使用DECLARE HANDLER語句如下:DECLARE action HANDLER FOR condition_value statement; 如果條件的值與condition_value匹配,則MySQL將執(zhí)行statement,并根據(jù)該操作繼續(xù)或退出當(dāng)前的代碼塊。操作(action)接受以下值之一:CONTINUE:繼續(xù)執(zhí)行封閉代碼塊(BEGIN . END)。EXIT:處理程序聲明封閉代碼塊的執(zhí)行終止。condition_value指定一個特定條件或一類激活處理程序的條件。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解自定義錯誤處理程序condition_va

22、lue接受以下值之一:一個MySQL錯誤代碼。標(biāo)準(zhǔn)SQLSTATE值或者它可以是SQLWARNING,NOTFOUND或SQLEXCEPTION條件,這是SQLSTATE值類的簡寫。NOTFOUND條件用于游標(biāo)或SELECT INTO variable_list語句。與MySQL錯誤代碼或SQLSTATE值相關(guān)聯(lián)的命名條件。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解自定義錯誤處理程序【例8-10】創(chuàng)建錯誤處理程序,完成以下功能:如果發(fā)生錯誤,則將has_error變量的值設(shè)置為1并繼續(xù)執(zhí)行。DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_erro

23、r = 1;【例8-11】創(chuàng)建錯誤處理程序,完成以下功能:如果發(fā)生錯誤,回滾上一個操作,發(fā)出錯誤消息,并退出當(dāng)前代碼塊。 如果在存儲過程的BEGIN END塊中聲明它,則會立即終止存儲過程。DECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINROLLBACK;SELECT An error has occurred, operation rollbacked and the stored procedure was terminated;END;任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件錯誤處理程序示例【例8-12】創(chuàng)建錯誤處理程序,完成以下功能:如果沒有更多的行要提取

24、,在光標(biāo)或SELECT INTO語句的情況下,將no_row_found變量的值設(shè)置為1并繼續(xù)執(zhí)行。DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_row_found = 1; 【例8-13】創(chuàng)建錯誤處理程序,完成以下功能:如果發(fā)生重復(fù)的鍵錯誤,則會發(fā)出MySQL錯誤1062。 它發(fā)出錯誤消息并繼續(xù)執(zhí)行。DECLARE CONTINUE HANDLER FOR 1062SELECT Error, duplicate key occurred;任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件錯誤處理程序示例接下來,為了更好地演示,我們創(chuàng)建一個綜合實(shí)例來演示錯誤處理程

25、序的使用效果:首先創(chuàng)建一個article_tags表,該表用來存儲文章和標(biāo)簽之間的關(guān)系。每篇文章可能有很多標(biāo)簽,反之亦然。為了簡單起見,我們在article_tags表中僅有兩個字段 article_id和 tag_id,分別代表文章ID和文章的標(biāo)簽ID:【例8-14】創(chuàng)建一個名為article_tags的新表。CREATE TABLE article_tags(article_id INT,tag_id INT,PRIMARY KEY(article_id,tag_id);任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件錯誤處理程序示例【例8-15】創(chuàng)建存儲過程,將文章的id和標(biāo)簽的id插入到articl

26、e_tags表中。DELIMITER /CREATE PROCEDURE insert_article_tags(IN article_id INT, IN tag_id INT)BEGIN DECLARE CONTINUE HANDLER FOR 1062 SELECT CONCAT(duplicate keys (,article_id,tag_id,) found) AS msg; - insert a new record into article_tags INSERT INTO article_tags(article_id,tag_id) VALUES(article_id,ta

27、g_id); - return tag count for the article SELECT COUNT(*) FROM article_tags;END /DELIMITER ;任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件錯誤處理程序示例【例8-16】通過調(diào)用insert_article_tags存儲過程,為文章ID為1添加標(biāo)簽ID:1,2和3。【例8-16】通過調(diào)用insert_article_tags存儲過程,為文章ID為1添加標(biāo)簽ID:1,2和3。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件錯誤處理程序示例mysql call nsert_article_tags(1,1);+-+| COUNT(*)

28、 |+-+| 1 |+-+1 row in set (0.02 sec)Query OK, 0 rows affected (0.03 sec)mysql call insert_article_tags(1,2);+-+| COUNT(*) |+-+| 2 |+-+1 row in set (0.03 sec)Query OK, 0 rows affected (0.05 sec)mysql call insert_article_tags(1,3);+-+| COUNT(*) |+-+| 3 |+-+1 row in set (0.03 sec)Query OK, 0 rows affec

29、ted (0.04 sec) mysql select * from article_tags;+-+-+| article_id | tag_id |+-+-+| 1 | 1 | 1 | 2 | 1 | 3 |+-+-+3 rows in set (0.03 sec)【例8-17】仍然使用例8-15中名為insert_article_tags的存儲過程,嘗試插入一個重復(fù)的記錄來檢查處理程序調(diào)用情況。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件錯誤處理程序示例MySQL CALL insert_article_tags(1,3);+-+| msg |+-+| duplicate keys (1,3) f

30、ound |+-+1 row in set+-+| COUNT(*) |+-+| 3 |+-+1 row in setQuery OK, 0 rows affected【例8-18】將例8-15中處理程序聲明中的CONTINUE更改為EXIT,然后在例8-15的基礎(chǔ)上,對表article_tags再進(jìn)行嘗試添加一個重復(fù)的記錄,檢查處理程序調(diào)用情況。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件錯誤處理程序示例DELIMITER /CREATE PROCEDURE insert_article_tags_exit(IN article_id INT, IN tag_id INT)BEGIN DECLARE

31、EXIT HANDLER FOR SQLEXCEPTION SELECT SQLException invoked; DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT(duplicate keys (,article_id,tag_id,) found) AS msg; DECLARE EXIT HANDLER FOR SQLSTATE 23000 SELECT SQLSTATE 23000 invoked; - insert a new record into article_tags INSERT INTO article_tags(article_i

32、d,tag_id)VALUES(article_id,tag_id); - return tag count for the article SELECT COUNT(*) FROM article_tags;END /DELIMITER ;【例8-18】將例8-15中處理程序聲明中的CONTINUE更改為EXIT,然后在例8-15的基礎(chǔ)上,對表article_tags再進(jìn)行嘗試添加一個重復(fù)的記錄,檢查處理程序調(diào)用情況。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件錯誤處理程序示例MySQL CALL insert_article_tags_exit(1,3);+-+| duplicate keys (1

33、,3) found |+-+| duplicate keys (1,3) found |+-+1 row in setQuery OK, 0 rows affected在存儲過程中如果使用多個處理程序來處理錯誤,MySQL數(shù)據(jù)庫將基于錯誤處理器的優(yōu)先級規(guī)則來選擇錯誤處理程序。其中MySQL 錯誤碼處理程序、SQLSTATE 錯誤處理程序、SQLEXCEPTION錯誤處理程序在順序上分別排在第1、2、3位。MySQL數(shù)據(jù)庫將調(diào)用最確定的處理程序來處理錯誤。MySQL數(shù)據(jù)庫在選擇錯誤處理程序時,通常會選擇描述錯誤最明確最無二義性的那個處理程序來執(zhí)行。因?yàn)镸ySQL數(shù)據(jù)庫系統(tǒng)執(zhí)行過程中出現(xiàn)的每個錯誤

34、都會映射到一個特定的錯誤碼,此錯誤碼不可能出現(xiàn)重復(fù),是最明確的。而一個 SQLSTATE 可以對應(yīng)到多個 MySQL 錯誤碼,所以沒那么明確。SQLEXCEPTION 和 SQLWARNING 分別指代的是 SQLSTATES 中類型相近的一組值,所以它的明確性最低。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解錯誤處理程序的優(yōu)先級【例8-19】insert_article_tags_3存儲過程中聲明三個處理程序。通過運(yùn)行該實(shí)例,了解多個處理程序之間的優(yōu)先級選擇。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解錯誤處理程序的優(yōu)先級MySQLDELIMITER /CREATE PROCEDURE insert_a

35、rticle_tags_3(IN ARTICLE_ID INT, IN TAG_ID INT)BEGIN DECLARE EXIT HANDLER FOR 1062 SELECT DUPLICATE KEYS ERROR ENCOUNTERED; DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT SQLEXCEPTION ENCOUNTERED; DECLARE EXIT HANDLER FOR SQLSTATE 23000 SELECT SQLSTATE 23000;- INSERT A NEW RECORD INTO ARTICLE_TAGS INS

36、ERT INTO ARTICLE_TAGS(ARTICLE_ID,TAG_ID) VALUES(ARTICLE_ID,TAG_ID);- RETURN TAG COUNT FOR THE ARTICLE SELECT COUNT(*) FROM ARTICLE_TAGS;END /MySQLDELIMITER ;【例8-19】insert_article_tags_3存儲過程中聲明三個處理程序。通過運(yùn)行該實(shí)例,了解多個處理程序之間的優(yōu)先級選擇。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解錯誤處理程序的優(yōu)先級MySQL CALL insert_article_tags_3(1,3);+-+| Dupl

37、icate keys error encountered |+-+| Duplicate keys error encountered |+-+1 row in setQuery OK, 0 rows affected【例8-20】insert_article_tags_4存儲過程中聲明三個處理程序。通過運(yùn)行該實(shí)例,了解多個處理程序之間的優(yōu)先級選擇。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解錯誤處理程序的優(yōu)先級mysqlDELIMITER /CREATE PROCEDURE insert_article_tags_4(IN ARTICLE_ID INT, IN TAG_ID INT)BEGIN D

38、ECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT SQLEXCEPTION ENCOUNTERED; DECLARE EXIT HANDLER FOR SQLSTATE 23000 SELECT SQLSTATE 23000;- INSERT A NEW RECORD INTO ARTICLE_TAGS INSERT INTO ARTICLE_TAGS(ARTICLE_ID,TAG_ID) VALUES(ARTICLE_ID,TAG_ID);- RETURN TAG COUNT FOR THE ARTICLE SELECT COUNT(*) FROM AR

39、TICLE_TAGS;END /mysqlDELIMITER ;【例8-20】insert_article_tags_4存儲過程中聲明三個處理程序。通過運(yùn)行該實(shí)例,了解多個處理程序之間的優(yōu)先級選擇。任務(wù)2 錯誤處理程序和錯誤觸發(fā)條件了解錯誤處理程序的優(yōu)先級mysql call insert_article_tags_4(1,3);+-+| sqlstate 23000 |+-+| sqlstate 23000 |+-+1 row in set (0.02 sec)Query OK, 0 rows affected (0.02 sec)前面介紹的MySQL函數(shù),無法使用返回多行記錄的語句。但如果

40、應(yīng)用中確實(shí)需要使用多行結(jié)果時,就需要使用到游標(biāo)。游標(biāo)可以幫用戶選擇出某個結(jié)果(這樣就可以從一組記錄集中返回單條記錄),另外,使用游標(biāo)也可以輕易的取出在檢索出來的行中前進(jìn)或后退,從而獲得一行或多行的結(jié)果。使用游標(biāo)時所需要的語法:1.定義游標(biāo):declare 游標(biāo)名 cursor for select語句;2.打開游標(biāo):open 游標(biāo)名;3.獲取結(jié)果:fetch 游標(biāo)名 into 變量名,變量名;4.關(guān)閉游標(biāo): close 游標(biāo)名;任務(wù)3 MySQL數(shù)據(jù)庫中的游標(biāo)認(rèn)識并使用游標(biāo)【例8-21】 創(chuàng)建一個存儲過程來選擇一組記錄,并在該存儲過程中使用游標(biāo)訪問記錄集合中的第一個記錄。mysql delim

41、iter /mysql create procedure pa() - begin - declare id bigint(8); - declare age tinyint(3); - declare mc cursor for select S_id,S_age from student; - open mc; - fetch mc into id,age; - select id,age; - close mc; - end /Query OK, 0 rows affected (0.02 sec)任務(wù)3 MySQL數(shù)據(jù)庫中的游標(biāo)認(rèn)識并使用游標(biāo)【例8-21】 創(chuàng)建一個存儲過程來選擇一組記

42、錄,并在該存儲過程中使用游標(biāo)訪問記錄集合中的第一個記錄。mysql delimiter ;mysql call pa();+-+-+| id | age |+-+-+| 1113080 | 19 |+-+-+1 row in set (0.03 sec)Query OK, 0 rows affected (0.03 sec)任務(wù)3 MySQL數(shù)據(jù)庫中的游標(biāo)認(rèn)識并使用游標(biāo)MySQL 官方將 prepare、execute、deallocate 統(tǒng)稱為 PREPARED STATEMENT。翻譯也就習(xí)慣的稱其為預(yù)處理語句。MySQL從早期的版本開始就支持預(yù)處理語句,目前普遍使用的 MySQL 版本

43、都是支持這一語法的。預(yù)處理語句的語法要點(diǎn):1、定義預(yù)處理語句PREPARE stmt_name FROM preparable_stmt;2、執(zhí)行預(yù)處理語句EXECUTE stmt_name USING var_name , var_name .;3、刪除(釋放)定義DEALLOCATE | DROP PREPARE stmt_name;使用預(yù)處理語句時,一定要先進(jìn)行預(yù)處理語句的定義之后,才能進(jìn)行執(zhí)行的操作,未定義的預(yù)處理語句無法使用。任務(wù)4 使用預(yù)處理SQL語句預(yù)處理SQL語句的使用步驟使用預(yù)處理SQL語句的注意事項(xiàng):1、stmt_name 作為 preparable_stmt 的接收者,唯

44、一標(biāo)識,不區(qū)分大小寫。2、preparable_stmt 語句中的“?”是個占位符,所代表的是一個字符串,不需要將“?”用引號包含起來。3、定義一個已存在的 stmt_name ,原有的將被立即釋放,類似于變量的重新賦值。4、PREPARE stmt_name 的作用域是session級。預(yù)處理編譯 SQL 是占用資源的,所以在使用后注意及時使用 DEALLOCATE PREPARE 釋放資源,這是一個好習(xí)慣。任務(wù)4 使用預(yù)處理SQL語句預(yù)處理SQL語句的使用步驟【例8-22】 利用字符串定義預(yù)處理 SQL 來進(jìn)行求兩個數(shù)平方和的計算。任務(wù)4 使用預(yù)處理SQL語句預(yù)處理SQL語句的應(yīng)用MySQL PREPARE stmt1 FROM SELECT SQRT(POW(?,2) + POW(?,2) AS pingfanghe;Query OK, 0 rows affected (0.00 sec)Statement preparedMySQL SET a = 3;Query OK, 0 rows aff

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論