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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM