MySQL存儲過程中IN、OUT、INOUT參數使用
MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN、OUT、INOUT形式如:
CREATE PROCEDURE([IN|OUT|INOUT] 參數名 數據類型,…)
IN 輸入參數:表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值。| 意思是說你的參數要傳到存儲過程的過程里面去
OUT 輸出參數:該值可在存儲過程內部被改變,并可返回 | 代表往外輸出
INOUT 輸入輸出參數:調用時指定,并且可被改變和返回 | 既能輸入一個值又能傳出來一個值
我們常用的操作數據庫語言SQL語句在執行的時候需要先編譯,然后執行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給定參數(如果該存儲過程帶有參數)來調用執行它。
一個存儲過程是一個可編程的函數,它在數據庫中創建并保存。它可以有SQL語句和一些特殊的控制結構組成。當希望在不同的應用程序或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是非常有用的。數據庫中的存儲過程可以看做是對編程中面向對象方法的模擬,它允許控制數據的訪問方式。
存儲過程通常有以下優點:
(1)存儲過程增強了SQL語言的功能和靈活性。存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的運算。
(2)存儲過程允許標準組件是編程。存儲過程被創建后,可以在程序中被多次調用,而不必重新編寫該存儲過程的SQL語句。而數據庫專業人員可以隨時對存儲過程進行修改,對就用程序源代碼毫無影響。
(3)存儲過程能實現較快的執行速度。如果某一操作包含大量的Transaction-SQL 代碼或分別被多次執行,那么存儲過程要比批處理的執行速度快很多。因為存儲過程是預編譯的。在首次運行一個存儲過程時查詢,優化器對其進行分析優化,并且給出最終被存儲在系統表中的執行計劃。而批處理的Transaction-SQL語句在每次運行時都要進行編譯和優化,速度相對要慢一些。
(4)存儲過程能減少網絡流量。針對同一個數據庫對象的操作(如查詢,修改),如果這一操作所涉及的Transaction-SQL語句被組織存儲過程,那(么當在客戶計算機上調用該存儲過程時,內鄉中傳送的只是該調用語句,從而大大增加了網絡流量并降低了網絡負載。
(5)存儲過程可被作為一種安全機制來充分利用。系統管理員通過執行某一存儲過程的權限進行限制,能夠實現對相應的數據的訪問權限的限制,避免了非授權用戶對數據的訪問,保證了數據的。
求1-n的和:
MariaDB [(none)]> DELIMITER $$
MariaDB [(none)]> CREATE PROCEDURE p1(IN n int)
-> BEGIN
-> declare total int default 0;
-> declare num int default 0;
-> WHILE num < n do
-> set num:=num+1;
-> set total:=total+num;
-> end while;
-> select total;
-> end$$
MariaDB [(none)]> DELIMITER ;
注:
這里需要注意的是DELIMITER $$ 和DELIMITER ; 兩句,DELIMITER是分割符的意思,因為MYSQL默認以“;”為分隔符,如果我們沒有聲明分割符,那么編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MYSQL才會將”;”當做存儲過程中的代碼,不會執行這些代碼,用完了之后 要把分隔符不愿。
過程體的開始與結束使用BEGIN和END進行標識。
MariaDB [hellodb]> DELIMITER $$
MariaDB [hellodb]> CREATE PROCEDURE p2(IN pp int) //IN 的使用例子
-> BEGIN
-> SELECT pp;
-> SET pp=2;
-> SELECT pp;
-> END$$
Query OK, 0 rows affected (0.01 sec)
MariaDB [hellodb]> DELIMITER ;
MariaDB [hellodb]> SELECT @pp;
+——+
| @pp |
+——+
| 1 |
+——+
1 row in set (0.00 sec)
MariaDB [hellodb]> CALL p2(@pp);
+——+
| pp |
+——+
| 1 |
+——+
1 row in set (0.01 sec)
+——+
| pp |
+——+
| 2 |
+——+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
MariaDB [hellodb]> SELECT @pp; //從這里可以看出IN 參數的話是,在內部改變,外部是不變的。
+——+
| @pp |
+——+
| 1 |
+——+
1 row in set (0.00 sec)
MariaDB [hellodb]> DELIMITER $$
MariaDB [hellodb]> CREATE PROCEDURE p4(OUT pp INT) //OUT 參數的使用
-> BEGIN
-> SELECT pp;
-> SET pp=2;
-> SELECT pp;
-> END$$
Query OK, 0 rows affected (0.01 sec)
MariaDB [hellodb]> DELIMITER ;
MariaDB [hellodb]> SET @pp=1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> SELECT @pp;
+——+
| @pp |
+——+
| 1 |
+——+
1 row in set (0.00 sec)
MariaDB [hellodb]> CALL p4(@pp);
+——+
| pp |
+——+
| NULL | //從這里就可以看出,OUT是只往外輸出 ,不會接受往內輸入的參數
+——+
1 row in set (0.01 sec)
+——+
| pp |
+——+
| 2 |
+——+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
MariaDB [hellodb]> SELECT @pp;
+——+
| @pp |
+——+
| 2 |
+——+
1 row in set (0.00 sec)
MariaDB [hellodb]>
總結IN、OUT區別:
IN:表示輸入一個值,你需要一個值,我給你一個值
OUT:你往外輸出一個值,你輸出的那個值我就拿一個變量來接收你給我輸出的那個值
MariaDB [hellodb]> DELIMITER $$
MariaDB [hellodb]> CREATE PROCEDURE p5(INOUT pp INT) //INOUT 參數的使用
-> BEGIN
-> SELECT pp;
-> SET pp=2;
-> SELECT pp;
-> END$$
Query OK, 0 rows affected (0.01 sec)
MariaDB [hellodb]> DELIMITER ;
MariaDB [hellodb]> SET @pp=1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> SELECT @pp;
+——+
| @pp |
+——+
| 1 |
+——+
1 row in set (0.00 sec)
MariaDB [hellodb]> CALL p5(@pp);
+——+
| pp |
+——+
| 1 | //既可接收輸入的參數
+——+
1 row in set (0.02 sec)
+——+
| pp |
+——+
| 2 |
+——+
1 row in set (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
MariaDB [hellodb]> SELECT @pp;
+——+
| @pp |
+——+
| 2 | //也可改變輸出的參數
+——+
1 row in set (0.00 sec)
MariaDB [hellodb]>
原創文章,作者:dance_man,如若轉載,請注明出處:http://www.www58058.com/75046