1. 程式人生 > >mysql儲存過程的學習(mysql提高執行效率之進階過程)

mysql儲存過程的學習(mysql提高執行效率之進階過程)

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;