mysql儲存過程的學習(mysql提高執行效率之進階過程)
阿新 • • 發佈:2019-01-28
1:儲存過程:
答:儲存過程是sql語句和控制語句的預編譯集合,以一個名稱儲存並作為一個單元處理;儲存過程儲存在資料庫內,可以由應用程式呼叫執行,而且允許使用者宣告變數以及進行流程控制,儲存型別可以接受引數,可以接受輸入型別的引數,也可以接受輸出型別的引數,並且可以存在多個返回值,因為儲存過程的效率要比單一的sql語句執行效率高很多;
注意:儲存過程執行效率之所高,在於普通的sql語句,每次都會對語法分析,編譯,執行,而儲存過程只是在第一次執行語法分析,編譯,執行,以後都是對結果進行呼叫。
2:儲存過程的優點:
答:
(1)增強sql語句的功能與靈活性[可以完成複雜的判斷和較複雜的運算];
(2)實現較快的執行速度[如果某一個操作包含大量的sql語句,都會執行分析,編譯,執行,由於儲存過程是預編譯的,所以當第一次呼叫儲存過程的時候,執行語法分析,編譯,執行,將結果儲存到記憶體中,以後直接呼叫結果即可];
(3)減少了網路流量[提交到伺服器的資料較少,相當於減少網路流量];
3:建立儲存過程的語法如下所示:
(1)CREATE [DEFINE = {user | CURRENT_USER}] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body 注意: proc_parameter: [IN | OUT |INOUT] param_name type (1)IN:表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中,這個值是不能夠返回的,意味著這個值只能進,不能出。 (2)OUT:表示該引數的值可以被儲存過程改變,並且可以返回。 (3)INOUT:表示該引數的呼叫時指定,並且可以被改變和返回。 (2)特性 COMMENT 'string' |{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY { DEFINER| INVOKER} COMMENT:註釋 CONTAINS SQL:包含sql語句,但不包含讀或寫資料的語句 NO SQL:不包含SQL語句 READS SQL DATA:包含讀資料的語句 MODIFIES SQL DATA:包含寫資料的語句 SQL SECURITY { DEFINER| INVOKER}:指明誰有許可權來執行 (3)過程體 --->過程體由合法的sql語句構成; --->可以是任意(任意特指對資料表的增刪改查操作或者多表的連線)的sql語句; --->過程體如果為複合結構則使用BEGIN...END語句; --->複合結構可以包含宣告,迴圈,控制結構
4:建立一個簡單的儲存過程,然後呼叫這個簡單的儲存過程;
4.1:建立一個查詢資料庫版本號的儲存過程;
1 #該儲存過程查詢資料庫的版本號 2 CREATE PROCEDURE sp1() SELECT VERSION();
呼叫這個簡單的儲存過程的語法結構:
1 方法一:CALL sp_name([parameter[,...]]) 2 3 4 5 方法二:CALL sp_name[()]
呼叫這個儲存過程的語法如下所示:
1 #呼叫一個儲存過程的語法 2 #CALL 儲存過程的名稱() 3 CALL sp1();
4.2:建立一個帶有IN型別引數的儲存過程;
1 #建立一個帶有IN型別引數的儲存過程,該儲存過程根據主鍵刪除該記錄 2 CREATE PROCEDURE removeGoodsById(IN goodsId INT UNSIGNED) 3 BEGIN 4 DELETE FROM tdb_goods WHERE goods_id = goodsId; 5 END
刪除一個儲存過程:drop producer 儲存過程名稱;
1 DROP PROCEDURE removeGoodsById;
呼叫這個儲存過程的語句:
1 CALL removeGoodsById(1);
4.2:建立一個帶有IN和OUT型別引數的儲存過程;
1 #帶有IN和OUT引數型別的儲存過程,刪除一個指編號的資料,然後返回記錄的總條數 2 3 CREATE PROCEDURE removeGoodsAndReturnGoodsNums(IN goodsId INT UNSIGNED,OUT goodsNums INT UNSIGNED) 4 BEGIN 5 DELETE FROM tdb_goods WHERE goods_id = goodsId; 6 SELECT count(goods_id) FROM tdb_goods INTO goodsNums; 7 END
執行這個帶有IN和OUT型別引數的儲存過程:
#執行帶有IN和OUT型別引數的儲存過程 CALL removeGoodsAndReturnGoodsNums(3,@nums); #查詢返回總記錄數 SELECT @nums;
4.3:建立一個帶有IN和多個OUT型別引數的儲存過程;
1 CREATE PROCEDURE removeGoodsByAgeReturnInfos(IN goodsCate INT UNSIGNED,OUT deleteGoods INT UNSIGNED,OUT goodsNums INT UNSIGNED) 2 BEGIN 3 DELETE FROM tdb_goods WHERE cate_id = goodsCate; 4 SELECT ROW_COUNT() INTO deleteGoods; 5 SELECT COUNT(goods_id) from tdb_goods into goodsNums; 6 end
然後執行這個帶有IN和多個OUT型別引數的儲存過程;
1 #執行這個帶有一個IN和多個OUT引數型別的儲存過程 2 CALL removeGoodsByAgeReturnInfos(2,@a,@b); 3 4 #檢視這個值 5 SELECT @a,@b; 6 7 select * from tdb_goods;