《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)》課件(共十七章節(jié)-下)_第1頁(yè)
《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)》課件(共十七章節(jié)-下)_第2頁(yè)
《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)》課件(共十七章節(jié)-下)_第3頁(yè)
《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)》課件(共十七章節(jié)-下)_第4頁(yè)
《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)》課件(共十七章節(jié)-下)_第5頁(yè)
已閱讀5頁(yè),還剩191頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

12視圖第章12.1視圖概述視圖是從數(shù)據(jù)庫(kù)中的一張或多張表中導(dǎo)出的表。創(chuàng)建視圖時(shí)所引用的表稱為基表。視圖中的數(shù)據(jù)并不是像表中那樣存儲(chǔ)在數(shù)據(jù)庫(kù)中,它只是讀取基表中的數(shù)據(jù)。對(duì)視圖的操作與對(duì)表的操作一樣,可以對(duì)其進(jìn)行查詢、修改和刪除等操作。在對(duì)視圖中的數(shù)據(jù)進(jìn)行修改時(shí),相應(yīng)的基本表中的數(shù)據(jù)也會(huì)發(fā)生變化;同時(shí),若基本表的數(shù)據(jù)發(fā)生變化,則這種變化也會(huì)反映到視圖中。與直接操作數(shù)據(jù)表相比,視圖主要有以下優(yōu)勢(shì):簡(jiǎn)單:視圖中看到的即是需要的,用戶完全不需要考慮對(duì)應(yīng)的表結(jié)構(gòu)、關(guān)聯(lián)條件和篩選條件。對(duì)于用戶來(lái)說(shuō),經(jīng)常使用的查詢可以被定義為視圖。安全:視圖可以作為一種安全機(jī)制。通過(guò)視圖,用戶只能查看和修改他們所看到的數(shù)據(jù),數(shù)據(jù)庫(kù)中的其他數(shù)據(jù)或表既看不見也不可以訪問(wèn),這樣用戶就被限制在了數(shù)據(jù)的不同子集上。數(shù)據(jù)獨(dú)立:視圖可以使應(yīng)用程序和數(shù)據(jù)表在一定程度上獨(dú)立,創(chuàng)建視圖之后,應(yīng)用程序可以建立在視圖之上,從而使程序與數(shù)據(jù)表分割開來(lái),這樣就可以屏蔽表結(jié)構(gòu)變化帶來(lái)的影響。12.2創(chuàng)建視圖視圖可以以一張表為基礎(chǔ)創(chuàng)建,也可以以多張表為基礎(chǔ)創(chuàng)建。創(chuàng)建視圖使用CREATEVIEW語(yǔ)句,其基本語(yǔ)法格式如下:CREATE[ORREPLACE]VIEWview_name[(column_list)]ASSELECT_statement;創(chuàng)建視圖時(shí)應(yīng)注意以下幾點(diǎn):定義中引用的任何表或視圖都必須存在。如果在創(chuàng)建視圖后,刪除定義時(shí)引用的表或視圖,則使用視圖時(shí)將導(dǎo)致錯(cuò)誤。創(chuàng)建視圖不能引用臨時(shí)表。SELECT語(yǔ)句中最大列名長(zhǎng)度為64個(gè)字符。在MySQL中,可以在單個(gè)數(shù)據(jù)表上創(chuàng)建視圖,這也是最簡(jiǎn)單的一種創(chuàng)建方法。12.2.1在單表上創(chuàng)建視圖CREATEVIEWv_tableASSELECTid,nameFROMgoods;【實(shí)例12-1】以第5章中“實(shí)例5-1”創(chuàng)建的goods表為基表創(chuàng)建視圖。步驟1

啟動(dòng)并登錄MySQL。步驟3

執(zhí)行SQL語(yǔ)句,基于goods表創(chuàng)建視圖v_table。步驟2

執(zhí)行以下語(yǔ)句,選擇數(shù)據(jù)庫(kù)db_shop。USEdb_shop;mysql>SELECT*FROMv_table;+-------------+--------------+|id |name |+-------------+--------------+|4 |休閑西服 ||5 |果汁 ||3 |水果糖 ||9 |牛仔褲 ||2 |牛奶糖 ||10 |紅樓夢(mèng) ||8 |蘋果 ||1 |西游記 ||7 |西瓜 ||6 |論語(yǔ) |+-------------+--------------+10rowsinset(0.05sec)步驟4

執(zhí)行SELECT語(yǔ)句,查詢視圖v_table。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:默認(rèn)情況下,視圖的字段名與基表的字段名相同。但是,為了增加數(shù)據(jù)安全性,也可以為視圖字段指定不同的名稱。12.2.1在單表上創(chuàng)建視圖mysql>SELECT*FROMv_table2;+----------------+--------------------------+|goods_id |goods_name |+----------------+--------------------------+|4 |休閑西服

||5 |果汁 ||3 |水果糖 ||9 |牛仔褲 ||2 |牛奶糖

||10 |紅樓夢(mèng)

||8 |蘋果 ||1 |西游記

||7 |西瓜

||6 |論語(yǔ) |+----------------+--------------------------+10rowsinset(0.00sec)【實(shí)例12-2】以第5章中“實(shí)例5-1”創(chuàng)建的goods表為基表創(chuàng)建視圖,并重新為視圖字段命名。SQL語(yǔ)句如下:CREATEVIEWv_table2(goods_id,goods_name)ASSELECTid,nameFROMgoods;語(yǔ)句執(zhí)行成功,查看v_table2視圖中的數(shù)據(jù),結(jié)果如下:12.2.2在多表上創(chuàng)建視圖mysql>SELECT*FROMv_table3;+-----------+-------------------------+|o_id |name |+-----------+-------------------------+|2 |牛奶糖 ||4 |休閑西服 ||6 |論語(yǔ)

||3 |水果糖 ||1 |西游記 ||5 |果汁 |+-----------+-------------------------+6rowsinset(0.03sec)【實(shí)例12-3】以第5章中“實(shí)例5-1”創(chuàng)建的goods表和“實(shí)例5-2”創(chuàng)建的orders表為基表,創(chuàng)建視圖,并重新為視圖字段命名。SQL語(yǔ)句如下:CREATEVIEWv_table3(o_id,name)ASSELECTorders.o_id,FROMgoodsJOINordersONgoods.id=orders.o_id;語(yǔ)句執(zhí)行成功后,查看v_table3視圖中的數(shù)據(jù),結(jié)果如下:使用NavicatforMySQL也可以創(chuàng)建視圖,具體操作步驟如下:12.2.3使用圖形化工具創(chuàng)建視圖步驟1

啟動(dòng)NavicatforMySQL并連接MySQL后,雙擊需要操作的數(shù)據(jù)庫(kù),此處為db_shop。步驟2

單擊“視圖”按鈕,顯示前面創(chuàng)建的視圖。單擊“新建視圖”按鈕,可以打開視圖編輯界面,如圖12-1所示。使用NavicatforMySQL也可以創(chuàng)建視圖,具體操作步驟如下:12.2.3使用圖形化工具創(chuàng)建視圖步驟3

切換到“視圖創(chuàng)建工具”選項(xiàng)卡,在左側(cè)雙擊要?jiǎng)?chuàng)建視圖的基本表,將其添加至右側(cè)窗口,之后在右側(cè)相應(yīng)字段的復(fù)選框中單擊可選擇要在視圖中顯示的字段,最后在右下角的窗口中進(jìn)一步編輯創(chuàng)建視圖的SQL語(yǔ)句,如圖12-2所示。步驟4

編輯好后單擊“保存”按鈕,在彈出的“視圖名”對(duì)話框中輸入視圖名,并單擊“確定”按鈕即可。12.3查看視圖使用DESC語(yǔ)句可以查看視圖的結(jié)構(gòu),其基本語(yǔ)法格式如下:DESC視圖名;mysql>DESCv_table;+-----------+------------+------------+------------+-----------+------------+|Field |Type |Null |Key |Default |Extra |+-----------+------------+------------+------------+-----------+------------+|id |int(11) |NO | |0 | ||name |char(30) |YES | |NULL | |+-----------+------------+------------+------------+-----------+------------+2rowsinset(0.02sec)【實(shí)例12-4】使用DESC語(yǔ)句查看視圖v_table的結(jié)構(gòu)。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:12.3.1查看視圖基本信息mysql>DESCgoods;+-------------------------+-----------------------------+--------+------------+-----------+-------------------------+|Field |Type |Null|Key |Default |Extra |+-------------------------+-----------------------------+--------+------------+-----------+-------------------------+|id |int(11) |NO|PRI |NULL |auto_increment ||type |char(30) |YES| |NULL | ||name |char(30) |YES|UNI |NULL | ||price |decimal(7,2)unsigned|YES| |NULL | ||num |int(11) |YES| |0 | ||add_time |datetime |YES| |NULL | |+-------------------------+-----------------------------+--------+------------+-----------+-------------------------+6rowsinset(0.00sec)【實(shí)例12-5】使用DESC語(yǔ)句查看基本表goods的結(jié)構(gòu)。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:12.3.1查看視圖基本信息使用SHOWCREATEVIEW語(yǔ)句可以查看視圖定義語(yǔ)句,其基本語(yǔ)法格式如下:SHOWCREATEVIEW視圖名;mysql>SHOWCREATEVIEWv_table2\G***************************1.row***************************View:v_table2CreateView:CREATEALGORITHM=UNDEFINEDDEFINER=`root`@`localhost`SQLSECURITYDEFINERVIEW`v_table2`ASselect`goods`.`id`AS`goods_id`,`goods`.`name`AS`goods_name`from`goods`character_set_client:gbkcollation_connection:gbk_chinese_ci1rowinset(0.00sec)【實(shí)例12-6】使用SHOWCREATEVIEW語(yǔ)句查看視圖v_table2的定義語(yǔ)句。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:12.3.2查看視圖定義語(yǔ)句在MySQL中,所有視圖的詳細(xì)信息都存儲(chǔ)在系統(tǒng)數(shù)據(jù)庫(kù)information_schema下的views表中。通過(guò)views表,可以查看數(shù)據(jù)庫(kù)中所有視圖的詳細(xì)信息。mysql>SELECT*FROMinformation_schema.views\G***************************1.row***************************TABLE_CATALOG:defTABLE_SCHEMA:db_shopTABLE_NAME:v_tableVIEW_DEFINITION:select`db_shop`.`goods`.`id`AS`id`,`db_shop`.`goods`.`name`AS`name`from`db_shop`.`goods`CHECK_OPTION:NONEIS_UPDATABLE:YESDEFINER:root@localhostSECURITY_TYPE:DEFINERCHARACTER_SET_CLIENT:gbkCOLLATION_CONNECTION:gbk_chinese_ci***************************2.row***************************TABLE_CATALOG:defTABLE_SCHEMA:db_shopTABLE_NAME:v_table2 ……【實(shí)例12-7】通過(guò)views表查看數(shù)據(jù)庫(kù)中視圖的詳細(xì)信息。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:12.3.3通過(guò)views表查看視圖詳細(xì)信息12.3.4使用圖形化工具查看視圖使用NavicatforMySQL也可以查看視圖,具體操作步驟如下:步驟1

啟動(dòng)NavicatforMySQL并連接MySQL后,雙擊需要操作的數(shù)據(jù)庫(kù),此處為db_shop。步驟2

單擊“視圖”按鈕,然后右擊要查看的視圖,在彈出的快捷菜單中選擇“對(duì)象信息”,如圖12-3所示。12.3.4使用圖形化工具查看視圖步驟3

“常規(guī)”選項(xiàng)卡中顯示了視圖的相關(guān)參數(shù)信息,“DDL”選項(xiàng)卡中顯示視圖的定義語(yǔ)句,如圖12-4所示。12.4修改視圖當(dāng)基本表的某些字段發(fā)生改變時(shí),可以通過(guò)修改視圖來(lái)保持與基本表的一致性。MySQL提供CREATEORREPLACEVIEW和ALTER語(yǔ)句來(lái)修改視圖。使用CREATEORREPLACEVIEW語(yǔ)句修改視圖的語(yǔ)法形式如下:12.4.1使用CREATEORREPLACEVIEW語(yǔ)句修改視圖CREATEORREPLACEVIEWview_name[(column_list)]ASSELECT_statement;【實(shí)例12-8】使用CREATEORREPLACEVIEW語(yǔ)句修改視圖v_table。步驟1

執(zhí)行以下語(yǔ)句,選擇數(shù)據(jù)庫(kù)db_shop,并使用DESC語(yǔ)句查看視圖結(jié)構(gòu)。USEdb_shop;mysql>DESCv_table;+-----------+------------+------------+------------+-----------+------------+|Field |Type |Null |Key |Default |Extra |+-----------+------------+------------+------------+-----------+------------+|id |int(11) |NO | |0 | ||name |char(30) |YES | |NULL | |+-----------+------------+------------+------------+-----------+------------+2rowsinset(0.02sec)12.4.1使用CREATEORREPLACEVIEW語(yǔ)句修改視圖mysql>DESCv_table;+-----------+---------------------------------------+------------+-----------+------------+------------+|Field |Type |Null |Key |Default |Extra |+-----------+---------------------------------------+------------+-----------+------------+------------+|id |int(11) |NO | |0 | ||name |char(30) |YES | |NULL | ||price |decimal(7,2)unsigned |YES | |NULL | |+-----------+---------------------------------------+------------+------------+-----------+------------+3rowsinset(0.00sec)步驟3

使用DESC語(yǔ)句查看視圖結(jié)構(gòu)。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:步驟2

使用CREATEORREPLACEVIEW語(yǔ)句修改視圖v_table。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:mysql>CREATEORREPLACEVIEWv_tableASSELECTid,name,priceFROMgoods;QueryOK,0rowsaffected(0.03sec)12.4.2使用ALTER語(yǔ)句修改視圖ALTERVIEWview_name[(column_list)]ASSELECT_statement;【實(shí)例12-9】使用ALTER語(yǔ)句修改視圖v_table2。步驟1

執(zhí)行以下語(yǔ)句,選擇數(shù)據(jù)庫(kù)db_shop,并使用DESC語(yǔ)句查看視圖結(jié)構(gòu)。USEdb_shop;mysql>DESCv_table2;+------------------+-----------------+--------+------+------------+-------+|Field |Type|Null|Key|Default|Extra|+------------------+-----------------+--------+------+------------+-------+|goods_id|int(11)|NO||0|||goods_name|varchar(30)|YES||NULL||+------------------+----------------+---------+------+------------+-------+2rowsinset(0.00sec)12.4.2使用ALTER語(yǔ)句修改視圖步驟2

執(zhí)行ALTER語(yǔ)句,修改視圖v_table2。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:mysql>ALTERVIEWv_table2(goods_id,goods_name,goods_price)ASSELECTid,name,priceFROMgoods;QueryOK,0rowsaffected(0.04sec)步驟3

使用DESC語(yǔ)句查看視圖結(jié)構(gòu)。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:mysql>DESCv_table2;+-----------------------------+-----------------------------+--------------+--------------+--------------+--------------+|Field |Type |Null |Key |Default |Extra |+-----------------------------+-----------------------------+--------------+--------------+--------------+--------------+|goods_id |int(11) |NO | |0 | ||goods_name |char(30) |YES | |NULL | ||goods_price |decimal(7,2)unsigned|YES | |NULL | |+-----------------------------+------------------------------+--------------+--------------+-------------+--------------+3rowsinset(0.00sec)12.4.3使用圖形化工具修改視圖步驟1

啟動(dòng)NavicatforMySQL并連接MySQL后,雙擊需要操作的數(shù)據(jù)庫(kù),此處為db_shop。步驟2

單擊“視圖”按鈕,然后選中需要修改的視圖,并單擊“設(shè)計(jì)視圖”按鈕,如圖12-5所示。圖12-5修改視圖12.4.3使用圖形化工具修改視圖步驟3

打開視圖編輯界面,可在“視圖創(chuàng)建工具”選項(xiàng)卡右下方編輯SQL語(yǔ)句,如圖12-6所示。圖12-6修改視圖定義語(yǔ)句12.5刪除視圖使用DROPVIEW語(yǔ)句可刪除一個(gè)或多個(gè)視圖。其基本語(yǔ)法格式如下:DROPVIEW[IFEXISTS]視圖1,……視圖n;【實(shí)例12-10】刪除視圖v_table。步驟1

執(zhí)行以下語(yǔ)句,選擇數(shù)據(jù)庫(kù)db_shop。步驟2

執(zhí)行以下語(yǔ)句,刪除視圖v_table。USEdb_shop;DROPVIEWIFEXISTSv_table;12.5.1使用DROPVIEW語(yǔ)句刪除視圖步驟3

執(zhí)行SQL語(yǔ)句,查看數(shù)據(jù)庫(kù)中的數(shù)據(jù)表。SQL語(yǔ)句及其執(zhí)行結(jié)果如右:mysql>SHOWTABLES;+--------------------------------------+|Tables_in_db_shop |+--------------------------------------+|goods ||new_goods ||orders ||people ||people1 ||people2 ||people3 ||people4 ||reply ||test_goods ||v_table2 ||v_table3 |+---------------------------------------+12rowsinset(0.00sec)12.5.2使用圖形化工具刪除視圖步驟1

啟動(dòng)NavicatforMySQL并連接MySQL后,雙擊需要操作的數(shù)據(jù)庫(kù),此處為db_shop。步驟2

單擊“視圖”按鈕,然后選擇需要?jiǎng)h除的視圖,單擊“刪除試圖”按鈕,最后確認(rèn)刪除即可,如圖12-7所示。圖12-7刪除視圖12.6操作視圖中數(shù)據(jù)由于視圖是一張?zhí)摂M表,所以對(duì)視圖中的數(shù)據(jù)進(jìn)行操作,實(shí)際上就是對(duì)基表進(jìn)行操作。當(dāng)視圖中的數(shù)據(jù)被修改,基表中的數(shù)據(jù)會(huì)同時(shí)被修改。同樣,當(dāng)基表中的數(shù)據(jù)被修改,視圖中的數(shù)據(jù)也會(huì)被修改?!緦?shí)例12-11】修改視圖v_table2中的數(shù)據(jù)。步驟1

修改視圖中數(shù)據(jù)之前,分別執(zhí)行SQL語(yǔ)句查看視圖和基表的信息。結(jié)果如下:mysql>SELECT*FROMv_table2;+----------------+------------------+------------------+|goods_id|goods_name|goods_price|+----------------+-----------------+----------------+|1 |西游記|50.40||2 |牛奶糖|7.50||3 |水果糖|2.50||4 |休閑西服|800.00||5 |果汁|2.50||6 |論語(yǔ)|109.00||7 |西瓜|1.50||8 |蘋果|3.00||9 |牛仔褲|120.00||10 |紅樓夢(mèng)|50.50|+----------------+-----------------+----------------+10rowsinset(0.04sec)12.6.1修改視圖中數(shù)據(jù)mysql>SELECTid,name,priceFROMgoods;+---+--------------+------------------------+|id|name|price |+---+--------------+------------------------+|1|西游記|50.40 ||2|牛奶糖|7.50 ||3|水果糖|2.50 ||4|休閑西服|800.00 ||5|果汁|2.50 ||6|論語(yǔ)|109.00 ||7|西瓜|1.50 ||8|蘋果|3.00 ||9|牛仔褲|120.00 ||10|紅樓夢(mèng)|50.50 |+---+--------------+------------------------+10rowsinset(0.00sec)步驟2

執(zhí)行SQL語(yǔ)句,修改視圖中數(shù)據(jù)。執(zhí)行結(jié)果如下:12.6.1修改視圖中數(shù)據(jù)mysql>UPDATEv_table2SETgoods_name='哈姆雷特'WHEREgoods_id=1;QueryOK,1rowaffected(0.10sec)Rowsmatched:1Changed:1Warnings:0步驟3

再次查看視圖和基表數(shù)據(jù)。結(jié)果如下:mysql>SELECT*FROMv_table2;+-------------+------------------+--------------------------+|goods_id |goods_name|goods_price |+-------------+------------------+--------------------------+|1 |哈姆雷特|50.40 ||2 |牛奶糖|7.50 ||3 |水果糖|2.50 ||4 |休閑西服|800.00 ||5 |果汁|2.50 ||6 |論語(yǔ)|109.00 ||7 |西瓜|1.50 ||8 |蘋果|3.00 ||9 |牛仔褲|120.00 ||10 |紅樓夢(mèng)|50.50 |+-------------+------------------+--------------------------+10rowsinset(0.00sec)mysql>SELECTid,name,priceFROMgoods;+--------------+-------------+--------------+|id |name |price |+--------------+-------------+--------------+|1 |哈姆雷特 |50.40 ||2 |牛奶糖 |7.50 ||3 |水果糖 |2.50 ||4 |休閑西服 |800.00 ||5 |果汁 |2.50 ||6 |論語(yǔ) |109.00 ||7 |西瓜 |1.50 ||8 |蘋果 |3.00 ||9 |牛仔褲 |120.00 ||10 |紅樓夢(mèng) |50.50 |+--------------+-------------+--------------+10rowsinset(0.00sec)刪除視圖中數(shù)據(jù)的方法與刪除表中數(shù)據(jù)相同。【實(shí)例12-12】刪除視圖v_table2中的第10條數(shù)據(jù)。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:12.6.2刪除視圖中數(shù)據(jù)mysql>DELETEFROMv_table2WHEREgoods_id=10;QueryOK,1rowaffected(0.05sec)查看視圖數(shù)據(jù):SELECT*FROMv_table2;查看基表數(shù)據(jù):SELECTid,name,priceFROMgoods;可分別執(zhí)行SQL語(yǔ)句查看視圖和表中數(shù)據(jù)。向視圖中插入數(shù)據(jù)的方法與向表中插入數(shù)據(jù)相同?!緦?shí)例12-13】向視圖v_table2中插入數(shù)據(jù)。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:12.6.3向視圖中插入數(shù)據(jù)mysql>INSERTINTOv_table2values(10,'紅樓夢(mèng)',138);QueryOK,1rowaffected(0.06sec)在向視圖中插入數(shù)據(jù)時(shí),應(yīng)注意視圖中必須包含基表中不允許為NULL的所有列,否則在插入數(shù)據(jù)時(shí)將會(huì)報(bào)錯(cuò)。13存儲(chǔ)過(guò)程和函數(shù)第章13.1存儲(chǔ)過(guò)程和函數(shù)概述針對(duì)表的一個(gè)完整操作往往不是單條SQL語(yǔ)句就能實(shí)現(xiàn)的,而是需要一組SQL語(yǔ)句來(lái)實(shí)現(xiàn)。例如,要完成一個(gè)購(gòu)買商品的訂單的處理,一般需要考慮以下幾步:可將一個(gè)完整操作中所包含的多條SQL語(yǔ)句創(chuàng)建為存儲(chǔ)過(guò)程或函數(shù),以方便應(yīng)用。(1)在生成訂單之前,首先需要查看商品庫(kù)存中是否有相應(yīng)商品;(2)如果商品庫(kù)存中不存在相應(yīng)商品,需要向供應(yīng)商訂貨;(3)如果商品庫(kù)存中存在相應(yīng)商品,需要預(yù)定商品,并修改庫(kù)存數(shù)量。存儲(chǔ)過(guò)程和函數(shù)可以簡(jiǎn)單地理解為一組經(jīng)過(guò)編譯并保存在數(shù)據(jù)庫(kù)中的SQL語(yǔ)句的集合,可以隨時(shí)被調(diào)用。允許標(biāo)準(zhǔn)組件式編程:存儲(chǔ)過(guò)程和函數(shù)在創(chuàng)建后可以在程序中被多次調(diào)用。較快的執(zhí)行速度:如果某一操作包含大量的事務(wù)處理代碼,并且被多次執(zhí)行,那么存儲(chǔ)過(guò)程要比批處理的執(zhí)行速度快很多。減少網(wǎng)絡(luò)流量:對(duì)于大量的SQL語(yǔ)句,將其組織成存儲(chǔ)過(guò)程,會(huì)比一條一條的調(diào)用SQL語(yǔ)句要大大節(jié)省網(wǎng)絡(luò)流量,降低網(wǎng)絡(luò)負(fù)載。安全:數(shù)據(jù)庫(kù)管理員通過(guò)設(shè)置執(zhí)行某一存儲(chǔ)過(guò)程的權(quán)限,從而限制相應(yīng)數(shù)據(jù)的訪問(wèn)權(quán)限,避免非授權(quán)用戶對(duì)數(shù)據(jù)的訪問(wèn),保證數(shù)據(jù)的安全。13.2創(chuàng)建并調(diào)用存儲(chǔ)過(guò)程和函數(shù)創(chuàng)建存儲(chǔ)過(guò)程使用SQL語(yǔ)句CREATEPROCEDURE來(lái)實(shí)現(xiàn),其語(yǔ)法形式如下:CREATEPROCEDUREproc_name([proc_parameter[,…])[characteristic…]routine_bodyproc_parameter表示存儲(chǔ)過(guò)程的參數(shù),參數(shù)形式如下:存儲(chǔ)程序可以分為存儲(chǔ)過(guò)程和函數(shù)。存儲(chǔ)過(guò)程和函數(shù)的操作主要包括創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)、調(diào)用存儲(chǔ)過(guò)程和函數(shù)、查看存儲(chǔ)過(guò)程和函數(shù),以及修改和刪除存儲(chǔ)過(guò)程和函數(shù)。13.2.1創(chuàng)建存儲(chǔ)過(guò)程[IN|OUT|INOUT]parameter_nameTYPEcharacteristic表示存儲(chǔ)過(guò)程的特性,可取值及其意義如下:LANGUAGESQL:表示存儲(chǔ)過(guò)程的routine_body部分使用SQL語(yǔ)言編寫。[NOT]DETERMINISTIC:DETERMINISTIC表示存儲(chǔ)過(guò)程的執(zhí)行結(jié)果是確定的;默認(rèn)為NOTDETERMINISTIC,表示執(zhí)行結(jié)果不確定。{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}:指明子程序使用SQL語(yǔ)句的限制。SQLSECURITY{DEFINER|INVOKER}:指定可執(zhí)行存儲(chǔ)過(guò)程的用戶,DEFINER表示只有創(chuàng)建者才能執(zhí)行,INVOKER表示擁有權(quán)限的調(diào)用者可以執(zhí)行。COMMENT'string':表示存儲(chǔ)過(guò)程或者函數(shù)的注釋信息。13.2.1創(chuàng)建存儲(chǔ)過(guò)程【實(shí)例13-1】創(chuàng)建一個(gè)名為proc的簡(jiǎn)單存儲(chǔ)過(guò)程,用于獲取goods表中的記錄數(shù)。在創(chuàng)建存儲(chǔ)過(guò)程前首先登錄MySQL,并選擇數(shù)據(jù)庫(kù)db_shop。然后執(zhí)行以下語(yǔ)句:mysql>DELIMITER$$mysql>CREATEPROCEDUREproc(OUTnumINT)->BEGIN->SELECTCOUNT(*)INTOnumFROMgoods;->END$$QueryOK,0rowsaffected(0.03sec)mysql>DELIMITER;

提示“DELIMITER$$”的作用是將語(yǔ)句的結(jié)束符“;”修改為“$$”,這樣存儲(chǔ)過(guò)程中的SQL語(yǔ)句結(jié)束符“;”就不會(huì)被MySQL解釋成語(yǔ)句的結(jié)束而提示錯(cuò)誤。在存儲(chǔ)過(guò)程創(chuàng)建完成后,應(yīng)使用“DELIMITER;”語(yǔ)句將結(jié)束符修改為默認(rèn)結(jié)束符。13.2.2創(chuàng)建存儲(chǔ)函數(shù)創(chuàng)建存儲(chǔ)函數(shù)使用SQL語(yǔ)句CREATEFUNCTION來(lái)實(shí)現(xiàn),其語(yǔ)法形式如下:CREATEFUNCTIONfunc_name([parameter_name[,…])RETURNSTYPE[characteristic…]routine_body【實(shí)例13-2】創(chuàng)建一個(gè)名為func的簡(jiǎn)單存儲(chǔ)函數(shù),用于獲取goods表中的記錄數(shù)。在創(chuàng)建存儲(chǔ)函數(shù)前首先登錄MySQL,并選擇數(shù)據(jù)庫(kù)db_shop。SQL語(yǔ)句的執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATEFUNCTIONfunc()->RETURNSINT(11)->RETURN(SELECTCOUNT(*)FROMgoods)->$$QueryOK,0rowsaffected(0.03sec)mysql>DELIMITER;

提示RETURNSTYPE子句對(duì)于存儲(chǔ)函數(shù)而言是必須存在的,如果RETURN子句返回值的數(shù)據(jù)類型與RETURNSTYPE子句指定的數(shù)據(jù)類型不同,MySQL會(huì)將返回值強(qiáng)制轉(zhuǎn)換為RETURNSTYPE子句指定的類型。13.2.3調(diào)用存儲(chǔ)過(guò)程和函數(shù)通常使用關(guān)鍵字CALL調(diào)用存儲(chǔ)過(guò)程,其語(yǔ)法形式如下:CALLprocedure_name([parameter[,…]]);存儲(chǔ)過(guò)程必須使用關(guān)鍵字CALL調(diào)用,而存儲(chǔ)函數(shù)與MySQL內(nèi)置函數(shù)的調(diào)用相同,使用關(guān)鍵字SELECT。調(diào)用存儲(chǔ)過(guò)程1【實(shí)例13-3】調(diào)用實(shí)例13-1創(chuàng)建的存儲(chǔ)過(guò)程proc(),查看其返回值。首先登錄MySQL,并選擇數(shù)據(jù)庫(kù)db_shop。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:mysql>CALLproc(@num);QueryOK,1rowaffected(0.06sec)mysql>SELECT@num;+----------+|@num |+----------+|10 |+----------+1rowinset(0.01sec)調(diào)用存儲(chǔ)過(guò)程的執(zhí)行結(jié)果與直接執(zhí)行查詢語(yǔ)句SELECTCOUNT(*)FROMgoods;的執(zhí)行結(jié)果相同,但是存儲(chǔ)過(guò)程的好處在于處理邏輯都封裝在數(shù)據(jù)庫(kù)端,調(diào)用者不需要了解中間的處理邏輯,當(dāng)處理邏輯發(fā)生變化時(shí),只需要修改存儲(chǔ)過(guò)程即可,而對(duì)調(diào)用者的程序完全沒有影響。13.2.3調(diào)用存儲(chǔ)過(guò)程和函數(shù)通常使用關(guān)鍵字SELECT調(diào)用存儲(chǔ)函數(shù),其語(yǔ)法形式如下:SELECTfunction_name([parameter[,……]]);【實(shí)例13-4】調(diào)用實(shí)例13-2創(chuàng)建的存儲(chǔ)函數(shù)func(),查看其返回值。首先登錄MySQL,并選擇數(shù)據(jù)庫(kù)db_shop。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:mysql>SELECTfunc();+----------+|func() |+----------+|10|+----------+1rowinset(0.04sec)調(diào)用存儲(chǔ)函數(shù)2使用NavicatforMySQL也可以創(chuàng)建存儲(chǔ)過(guò)程和函數(shù),具體操作如下。13.2.4使用圖形化工具創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)步驟1

使用NavicatforMySQL連接MySQL后,雙擊需要操作的數(shù)據(jù)庫(kù)“test_db”,然后單擊“函數(shù)”按鈕。步驟2

單擊“新建函數(shù)”按鈕,選擇需要?jiǎng)?chuàng)建的類型,此處選擇創(chuàng)建存儲(chǔ)過(guò)程,如圖13-1所示。圖13-1選擇類型13.2.4使用圖形化工具創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)步驟3

在編輯區(qū)填寫存儲(chǔ)過(guò)程需要的參數(shù),單擊編輯區(qū)左下方的“+”按鈕可以添加參數(shù),單擊“-”按鈕可以刪除參數(shù),如果存儲(chǔ)過(guò)程沒有參數(shù),直接單擊“完成”按鈕即可,如圖13-2所示。圖13-2填寫參數(shù)13.2.4使用圖形化工具創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)步驟4

在BEGIN…END語(yǔ)句中編輯需要執(zhí)行的SQL語(yǔ)句,如圖13-3所示。圖13-3編輯SQL語(yǔ)句13.2.4使用圖形化工具創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)步驟5

在“高級(jí)”選項(xiàng)卡中可以設(shè)置存儲(chǔ)程序的特性,最后單擊“保存”按鈕,輸入名稱確定即可,如圖13-4所示。圖13-4保存存儲(chǔ)過(guò)程13.3關(guān)于存儲(chǔ)過(guò)程和函數(shù)的表達(dá)式13.3.1變量變量是表達(dá)式中最基本的元素,可用于存儲(chǔ)臨時(shí)數(shù)據(jù)。本節(jié)簡(jiǎn)單介紹變量的分類,以及在存儲(chǔ)過(guò)程和函數(shù)中應(yīng)用變量的方法。本節(jié)詳細(xì)介紹存儲(chǔ)過(guò)程和函數(shù)中所包含的表達(dá)式語(yǔ)句。此處的表達(dá)式同其他高級(jí)語(yǔ)言中一樣,主要由變量、運(yùn)算符和流程控制語(yǔ)句構(gòu)成。用戶變量(User-DefinedVariables):帶有前綴@,只能被定義它的用戶使用,作用于當(dāng)前整個(gè)連接,當(dāng)前連接斷開后,所定義的用戶變量會(huì)被全部釋放。用戶變量不用提前定義就可以直接使用。局部變量(LocalVariables):沒有前綴,一般用于SQL語(yǔ)句塊中,比如存儲(chǔ)過(guò)程的BEGIN…END中。局部變量使用前需要先通過(guò)DECLARE聲明。如沒有聲明,則初始值為NULL。系統(tǒng)變量(ServerSystemVariables):帶有前綴@@,MySQL有許多已經(jīng)設(shè)置默認(rèn)值的系統(tǒng)變量。系統(tǒng)變量包含全局變量和會(huì)話變量。全局變量會(huì)影響整個(gè)服務(wù)器,而會(huì)話變量只影響個(gè)人客戶端連接。變量的分類113.3.1變量在存儲(chǔ)過(guò)程和函數(shù)中應(yīng)用變量2局部變量可以在子程序中定義并應(yīng)用,其作用范圍是BEGIN…END語(yǔ)句塊。1)定義變量在存儲(chǔ)過(guò)程中使用DECLARE語(yǔ)句定義局部變量,其語(yǔ)法形式如下:DECLAREvar_name[,…]type[DEFAULTvalue];例如,定義一個(gè)INT類型的變量,名稱為var1:DECLAREvar1INT;

提示變量的定義必須在復(fù)合語(yǔ)句開頭,并且在任何其他語(yǔ)句前面。也就是說(shuō),DECLARE語(yǔ)句在存儲(chǔ)過(guò)程和函數(shù)中使用時(shí),必須出現(xiàn)在BEGIN…END語(yǔ)句塊的最前面,并且變量名不區(qū)分大小寫??梢砸淮温暶鞫鄠€(gè)相同類型的變量。13.3.1變量2)為變量賦值定義變量之后,可以使用SET關(guān)鍵字為變量賦值,語(yǔ)法形式如下:SETvar_name=expr[,var_name=expr]…;為前面定義的變量var1賦值,具體如下:SETvar1=3;變量值可以為常量或者表達(dá)式。另外,也可以使用SELECT…INTO…查詢語(yǔ)句將查詢結(jié)果賦給變量,這要求查詢結(jié)果必須只有一行,具體語(yǔ)法形式如下:SELECTcol_name[,……]INTOvar_name[,……]FROMtable_name;13.3.1變量mysql>DELIMITER$$mysql>CREATEPROCEDUREproc1()->BEGIN->DECLAREvar1,var2,var3,g_idINT;->SETvar1=1,var2=2;->SETvar3=var1+var2;->SELECTidintog_idFROMgoodsWHEREid=1;->END$$QueryOK,0rowsaffected(0.10sec)mysql>DELIMITER;【實(shí)例13-5】執(zhí)行SQL語(yǔ)句,定義變量并為其賦值。首先登錄MySQL,并選擇數(shù)據(jù)庫(kù)db_shop。然后創(chuàng)建存儲(chǔ)過(guò)程并定義變量,SQL語(yǔ)句及其執(zhí)行結(jié)果如下:13.3.2定義條件和處理程序條件和處理程序是MySQL提供的一種異常處理機(jī)制,定義條件是事先定義程序執(zhí)行過(guò)程中可能會(huì)遇到的問(wèn)題;定義處理程序是定義在遇到問(wèn)題時(shí)執(zhí)行的相應(yīng)處理方法,并且保證存儲(chǔ)過(guò)程和函數(shù)在遇到問(wèn)題時(shí)不終止。定義條件1在MySQL中定義條件使用DECLARE…CONDITION語(yǔ)句,其語(yǔ)法形式如下:DECLAREcondition_nameCONDITIONFOR[condition_type];mysql_error_code:表示數(shù)值類型錯(cuò)誤代碼。sqlstate_value:表示長(zhǎng)度為5的字符串類型錯(cuò)誤代碼。下面以名為“not_found_database”的條件“ERROR1049(42000)”的定義為例,來(lái)看看這兩種形式的區(qū)別。DECLAREnot_found_databaseCONDITIONFOR1049;DECLAREnot_found_databaseCONDITIONFORSQLSTATE‘42000’;

提示數(shù)值類型的錯(cuò)誤代碼不要使用0,因?yàn)?表示成功而不是錯(cuò)誤;字符串類型的錯(cuò)誤代碼不要使用'00',因?yàn)?00'表示成功而不是錯(cuò)誤。13.3.2定義條件和處理程序定義處理程序2在定義條件之后,可以使用DECLARE…HANDLER語(yǔ)句定義處理程序,語(yǔ)法形式如下:DECLAREhandler_typeHANDLERFORcondition_value[...]statementCONTINUE:表示遇到錯(cuò)誤不處理,程序繼續(xù)執(zhí)行。EXIT:表示遇到錯(cuò)誤立即退出程序。UNDO:表示遇到錯(cuò)誤后撤回之前的操作,目前MySQL暫不支持該操作。mysql_error_code:表示數(shù)值類型的錯(cuò)誤代碼。sqlstate_value:表示包含5個(gè)字符的字符串錯(cuò)誤值。condition_name:表示使用DECLARE…CONDITION語(yǔ)句定義的條件名。SQLWARNING:匹配所有以01開頭的SQLSTATE錯(cuò)誤代碼。NOTFOUND:匹配所有以02開頭的SQLSTATE錯(cuò)誤代碼。SQLEXCEPTION:匹配所有未被SQLWARNING和NOTFOUND捕獲的SQLSTATE錯(cuò)誤代碼。13.3.2定義條件和處理程序statement為程序語(yǔ)句段,表示在遇到定義的異常條件時(shí),需要執(zhí)行的存儲(chǔ)過(guò)程或函數(shù)。DECLARECONTINUEHANDLERFORSQLSTATE'42s02'SET@info='cannotfind';方法一:捕獲sqlstate_valueDECLARECONTINUEHANDLERFOR1146SET@info='cannotfind';方法二:捕獲mysql_error_codeDECLAREcan_not_findCONDITIONFOR1146;DECLARECONTINUEHANDLERFORcan_not_findSET@info='cannotfind';方法三:先定義條件,然后再調(diào)用條件DECLAREEXITHANDLERFORSQLWARNINGSET@info='error';方法四:使用SQLWARNINGDECLAREEXITHANDLERFORNOTFOUNDSET@info='cannotfind';方法五:使用NOTFOUND13.3.2定義條件和處理程序DECLAREEXITHANDLERFORSQLEXCEPTIONSET@info='error';方法六:使用SQLEXCEPTIONmysql>DELIMITER$$mysql>CREATEPROCEDUREhandlerdemo()->BEGIN->DECLARECONTINUEHANDLERFORSQLSTATE'23000'SET@x2=1;->SET@x=1;->INSERTINTOt_handlerVALUES(1);->SET@x=2;->INSERTINTOt_handlerVALUES(1);->SET@x=3;->END$$QueryOK,0rowsaffected(0.03sec)mysql>DELIMITER;【實(shí)例13-6】執(zhí)行SQL語(yǔ)句,在存儲(chǔ)過(guò)程中定義條件和處理程序,體驗(yàn)異常處理機(jī)制在存儲(chǔ)過(guò)程中的作用。步驟1

登錄MySQL,并選擇任一數(shù)據(jù)庫(kù),之后執(zhí)行以下SQL語(yǔ)句,創(chuàng)建t_handler表。CREATETABLEt_handler(s1INT,PRIMARYKEY(s1));步驟2

在存儲(chǔ)過(guò)程和函數(shù)中定義條件和處理程序,SQL語(yǔ)句及其執(zhí)行結(jié)果如下。13.3.2定義條件和處理程序mysql>CALLhandlerdemo();QueryOK,0rowsaffected(0.11sec)mysql>SELECT@X;+----------+|@X |+----------+|3 |+----------+1rowinset(0.00sec)步驟3

調(diào)用存儲(chǔ)過(guò)程,查看變量x的值,SQL語(yǔ)句及其執(zhí)行結(jié)果如下。mysql>DELIMITER$$mysql>CREATEPROCEDUREhandlerdemo2()->BEGIN->SET@x=1;->INSERTINTOt_handlerVALUES(1);->SET@x=2;->INSERTINTOt_handlerVALUES(1);->SET@x=3;->END$$QueryOK,0rowsaffected(0.00sec)mysql>DELIMITER;步驟4

在存儲(chǔ)過(guò)程中不定義條件和處理程序,SQL語(yǔ)句及其執(zhí)行結(jié)果如下。13.3.2定義條件和處理程序mysql>CALLhandlerdemo2();ERROR1062(23000):Duplicateentry'1'forkey'PRIMARY'mysql>SELECT@X;+----------+|@X |+----------+|1 |+----------+1rowinset(0.00sec)步驟5

調(diào)用存儲(chǔ)過(guò)程,查看變量x的值,SQL語(yǔ)句及其執(zhí)行結(jié)果如下。由結(jié)果可以看出,當(dāng)在存儲(chǔ)過(guò)程中定義條件和處理程序時(shí),程序在遇到錯(cuò)誤后會(huì)繼續(xù)執(zhí)行直到最后一步,為變量@x賦值為3;而當(dāng)存儲(chǔ)過(guò)程中沒有定義條件和處理程序時(shí),程序在遇到錯(cuò)誤后會(huì)立即終止,此時(shí)變量@x的值為1。13.3.3游標(biāo)的使用在存儲(chǔ)過(guò)程和函數(shù)中,當(dāng)查詢語(yǔ)句返回多條記錄時(shí),可以使用游標(biāo)對(duì)結(jié)果集進(jìn)行逐條讀取。本節(jié)介紹定義、打開、使用和關(guān)閉游標(biāo)的方法。定義游標(biāo)1在MySQL中,使用DECLARE關(guān)鍵字來(lái)定義游標(biāo),其語(yǔ)法形式如下:DECLAREcursor_nameCURSORFORselect_statement;打開游標(biāo)2打開游標(biāo)的關(guān)鍵字為OPEN,其語(yǔ)法形式如下:OPENcursor_name;使用游標(biāo)3使用游標(biāo)的關(guān)鍵字是FETCH,其語(yǔ)法形式如下:FETCHcursor_nameINTOvar_name[,var_name]…關(guān)閉游標(biāo)4關(guān)閉游標(biāo)的關(guān)鍵字為CLOSE,其語(yǔ)法形式如下:CLOSEcursor_name;13.3.3游標(biāo)的使用mysql>DELIMITER$$mysql>CREATEPROCEDUREproc9(INflagVARCHAR(10),OUTgnameVARCHAR(30),OUTgpriceDECIMAL(7,2))->BEGIN->DECLAREg_idINT;->DECLAREg_nameVARCHAR(30);->DECLAREg_priceDECIMAL(7,2);->DECLAREg_cursorCURSORFORSELECTid,name,priceFROMdb_shop.goods;->DECLAREEXITHANDLERFORNOTFOUNDCLOSEg_cursor;->OPENg_cursor;->REPEAT->FETCHg_cursorINTOg_id,g_name,g_price;->IFg_id=flagTHEN->SELECTg_name,g_priceINTOgname,gprice;->ENDIF;->UNTILg_id=flag->ENDREPEAT;->CLOSEg_cursor;->END$$QueryOK,0rowsaffected(0.12sec)mysql>DELIMITER;【實(shí)例13-7】創(chuàng)建存儲(chǔ)過(guò)程,并在存儲(chǔ)過(guò)程中使用游標(biāo)。在創(chuàng)建存儲(chǔ)過(guò)程前首先登錄MySQL,并選擇數(shù)據(jù)庫(kù)db_shop。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:13.3.3游標(biāo)的使用mysql>CALLproc9(5,@gname,@gprice);QueryOK,1rowaffected(0.06sec)mysql>SELECT@gname,@gprice;+-------------------------+-------------------------+|@gname |@gprice |+-------------------------+-------------------------+|果汁 |2.50 |+-------------------------+-------------------------+1rowinset(0.01sec)調(diào)用存儲(chǔ)過(guò)程,查看結(jié)果:13.3.4流程控制的使用流程控制語(yǔ)句是指可以控制程序運(yùn)行順序的指令,程序運(yùn)行順序主要包括順序執(zhí)行、條件執(zhí)行和循環(huán)執(zhí)行。MySQL支持的流程控制語(yǔ)句包括IF語(yǔ)句、CASE語(yǔ)句、LOOP語(yǔ)句、REPEAT語(yǔ)句、WHILE語(yǔ)句、LEAVE語(yǔ)句、ITERATE語(yǔ)句和RETURN語(yǔ)句。IF語(yǔ)句1IF實(shí)現(xiàn)條件判斷,語(yǔ)句中可以包含多個(gè)判斷條件,系統(tǒng)會(huì)根據(jù)條件的結(jié)果是否為TRUE執(zhí)行相應(yīng)的操作,語(yǔ)法形式如下:IFsearch_conditionTHENstatement_list[ELSEIFsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDIF13.3.4流程控制的使用CASE語(yǔ)句2CASE語(yǔ)句可以實(shí)現(xiàn)比IF語(yǔ)句更復(fù)雜的條件構(gòu)造,該語(yǔ)句有兩種使用形式。第1種語(yǔ)法形式如下:CASEcase_exprWHENwhen_valueTHENstatement_list[WHENwhen_valueTHENstatement_list]...[ELSEstatement_list]ENDCASECASE語(yǔ)句的第2種語(yǔ)法形式如下:CASEWHENsearch_conditionTHENstatement_list[WHENsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDCASE13.3.4流程控制的使用LOOP語(yǔ)句和LEAVE語(yǔ)句3LOOP語(yǔ)句可以實(shí)現(xiàn)簡(jiǎn)單的循環(huán),使得系統(tǒng)能夠重復(fù)執(zhí)行循環(huán)結(jié)構(gòu)內(nèi)的語(yǔ)句列表。該語(yǔ)句列表由一條或多條語(yǔ)句組成,每條語(yǔ)句使用分號(hào)(;)隔開。語(yǔ)法形式如下:[loop_label:]LOOPstatement_listENDLOOP[end_label]如果不在statement_list中增加退出循環(huán)的語(yǔ)句,LOOP語(yǔ)句可以實(shí)現(xiàn)簡(jiǎn)單的死循環(huán)。使用LEAVE語(yǔ)句可以退出循環(huán)。語(yǔ)法形式如下:LEAVElabel;REPEAT語(yǔ)句4REPEAT語(yǔ)句可以實(shí)現(xiàn)一個(gè)帶條件判斷的循環(huán)結(jié)構(gòu)。語(yǔ)法形式如下:[repeat_label:]REPEATstatement_listUNTILsearch_conditionENDREPEAT[repeat_label]13.3.4流程控制的使用WHILE語(yǔ)句5WHILE語(yǔ)句同樣可以實(shí)現(xiàn)一個(gè)帶條件判斷的循環(huán)結(jié)構(gòu),但與REPEAT語(yǔ)句不同的是,WHILE語(yǔ)句會(huì)先對(duì)條件進(jìn)行判斷,如果為TRUE,才會(huì)執(zhí)行需要循環(huán)的操作,否則終止循環(huán),語(yǔ)法形式如下:[while_label:]WHILEsearch_conditionDOstatement_listENDWHILE[while_label]ITERATE語(yǔ)句6ITERATE語(yǔ)句只可以出現(xiàn)在LOOP語(yǔ)句、REPEAT語(yǔ)句和WHILE語(yǔ)句中,意義為再次執(zhí)行循環(huán),語(yǔ)法形式如下:ITERATElabel;13.3.4流程控制的使用mysql>DELIMITER$$mysql>CREATEPROCEDUREproc8(p1int)->BEGIN->label1:LOOP->SETp1=p1+1;->IFp1<10THEN->ITERATElabel1;->ENDIF;->LEAVElabel1;->ENDLOOPlabel1;->SET@y=p1;->END$$QueryOK,0rowsaffected(0.00sec)mysql>DELIMITER;【實(shí)例13-8】創(chuàng)建存儲(chǔ)過(guò)程,并在存儲(chǔ)過(guò)程中使用ITERATE語(yǔ)句。在創(chuàng)建存儲(chǔ)過(guò)程前首先登錄MySQL,并選擇數(shù)據(jù)庫(kù)db_shop。SQL語(yǔ)句及其執(zhí)行結(jié)果如下:mysql>CALLproc8(1);QueryOK,0rowsaffected(0.01sec)mysql>SELECT@y;+----------+|@y |+----------+|10 |+----------+1rowinset(0.00sec)調(diào)用存儲(chǔ)過(guò)程,查看結(jié)果。13.4查看存儲(chǔ)過(guò)程和函數(shù)創(chuàng)建完存儲(chǔ)過(guò)程和函數(shù)后,MySQL存儲(chǔ)了其狀態(tài)信息和定義語(yǔ)句,用戶可以分別使用SHOWSTATUS和SHOWCREATE語(yǔ)句進(jìn)行查看,也可以在系統(tǒng)數(shù)據(jù)庫(kù)information_schema中查看。使用SHOWSTATUS語(yǔ)句可以查看存儲(chǔ)過(guò)程和函數(shù)的狀態(tài)?;菊Z(yǔ)法形式如下:13.4.1查看存儲(chǔ)過(guò)程和函數(shù)的狀態(tài)SHOW{PROCEDURE|FUNCTION}STATUS[LIKE'pf_name'];【實(shí)例13-9】執(zhí)行SQL語(yǔ)句,查看存儲(chǔ)過(guò)程proc的基本信息。首先登錄MySQL,然后執(zhí)行SHOWSTATUS語(yǔ)句,執(zhí)行結(jié)果如下:mysql>SHOWPROCEDURESTATUSLIKE'proc'\G***************************1.row***************************Db:db_shopName:procType:PROCEDUREDefiner:root@localhostModified:2018-06-0915:06:48Created:2018-06-0915:06:48Security_type:DEFINERComment:character_set_client:gbkcollation_connection:gbk_chinese_ciDatabaseCollation:utf8_general_ci1rowinset(0.02sec)使用SHOWCREATE語(yǔ)句可以查看存儲(chǔ)過(guò)程和函數(shù)的定義語(yǔ)句,語(yǔ)法形式如下:13.4.2查看存儲(chǔ)過(guò)程和函數(shù)的定義SHOWCREATE{PROCEDURE|FUNCTION}pf_name;【實(shí)例13-10】執(zhí)行SQL語(yǔ)句,查看存儲(chǔ)過(guò)程proc的定義語(yǔ)句。首先登錄MySQL,然后執(zhí)行SHOWCREA

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論