一、簡介
- 從 5.0 版本才開始支持,是一組為了完成特定功能的SQL陳述句集合(封裝),比傳統SQL速度更快、執行效率更高,
- 存盤程序的優點
1、執行一次后,會將生成的二進制代碼駐留緩沖區(便于下次執行),提高執行效率
2、SQL陳述句加上控制陳述句的集合,靈活性高
3、在服務器端存盤,客戶端呼叫時,降低網路負載
4、可多次重復被呼叫,可隨時修改,不影響客戶端呼叫
5、 可完成所有的資料庫操作,也可控制資料庫的資訊訪問權限 - 為什么要用存盤程序?
1.減輕網路負載;2.增加安全性
二、創建存盤程序
2.1 創建基本程序
使用create procedure陳述句創建存盤程序
存盤程序的主體部分,被稱為程序體;以begin開始,以end$$結束
#宣告陳述句結束符,可以自定義:
delimiter $$
#宣告存盤程序
create procedure 存盤程序名(in 引數名 引數型別)
begin
#定義變數
declare 變數名 變數型別
#變數賦值
set 變數名 = 值
sql 陳述句1;
sql 陳述句2;
...
end$$
#恢復為原來的陳述句結束符
delimiter ;(有空格)
實體:
mysql> delimiter $$
mysql> create procedure text()
-> begin
-> select * from stu.a_player;
-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
呼叫存盤程序
call 存盤程序名(實際引數);
mysql> call text;
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 1 | zhangsan | 88 |
| 2 | lisi | 89 |
| 3 | wangwu | 67 |
| 4 | zhaoliu | 90 |
| 5 | xuli | 80 |
| 6 | keke | 75 |
+----+----------+-------+
6 rows in set (0.00 sec)
洗掉存盤程序
mysql> drop procedure text;
2.2 存盤程序的引數
MySQL存盤程序的引數用在存盤程序的定義,共有三種引數型別,IN,OUT,INOUT,形式如:
CREATEPROCEDURE 存盤程序名([[IN |OUT |INOUT ] 引數名 資料類形...])
IN 輸入引數:表示呼叫者向程序傳入值(傳入值可以是字面量或變數)
OUT 輸出引數:表示程序向呼叫者傳出值(可以回傳多個值)(傳出值只能是變數)
INOUT 輸入輸出引數:既表示呼叫者向程序傳入值,又表示程序向呼叫者傳出值(值只能是變數)
傳遞引數實體:
IN
mysql> create procedure test1(in in_id int(2))
-> begin
-> select * from stu.a_player where id=in_id;
-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
#將4傳遞給in_id變數,執行事務
mysql> call test1(4);
+----+---------+-------+
| id | name | score |
+----+---------+-------+
| 4 | zhaoliu | 90 |
+----+---------+-------+
1 row in set (0.00 sec)
#將6傳遞給in_id變數,執行事務
mysql> call test1(6);
+----+------+-------+
| id | name | score |
+----+------+-------+
| 6 | keke | 75 |
+----+------+-------+
1 row in set (0.00 sec)
OUT
mysql> delimiter $$
mysql> create procedure test2(out aa int)
-> begin
-> select aa;
-> set aa=2;
-> select aa;
-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
#將@aa變數傳遞給test2 事務
mysql> call test2(@aa);
+------+
| aa |
+------+
| NULL |
+------+
#out向呼叫者輸出引數,不接收輸入的引數,所以aa為null
1 row in set (0.00 sec)
+------+
| aa |
+------+
| 2 |
+------+
事務將aa變數設定為2(設定的是全域),則可進行輸出
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select @aa;
+------+
| @aa |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
#事務外查詢變數,已經被修改
IN 、OUT、 INOUT 對比
mysql> delimiter //
mysql> create procedure test3(in num1 int,out num2 int,inout num3 int)
-> begin
-> select num1,num2,num3;
-> set num1=10,num2=20,num3=30;
-> select num1,num2,num3;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call test3(@num1,@num2,@num3);
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 1 | NULL | 3 |
+------+------+------+
1 row in set (0.00 sec)
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 10 | 20 | 30 |
+------+------+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
- in和inout引數會將全域變數的值傳入存盤程序中,而out引數不會將全域變數的值傳入存盤程序中,在存盤程序使用中,引數值in,out,inout都會發生改變,
mysql> select @num1,@num2,@num3;
+-------+-------+-------+
| @num1 | @num2 | @num3 |
+-------+-------+-------+
| 1 | 20 | 30 |
+-------+-------+-------+
1 row in set (0.00 sec)
- 呼叫完存盤程序后,發現in引數不會對全域變數的值引起變化,而out和inout引數呼叫完存盤程序后,會對全域變數的值產生變化,會將存盤程序參考后的值賦值給全域變數,
- in引數賦值型別可以是變數還有定值,而out和inout引數賦值型別必須為變數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/205123.html
標籤:其他
上一篇:Mybatis框架基礎-03
