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;