MySQL存儲過程中IN、OUT、INOUT參數使用

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

(2)
dance_mandance_man
上一篇 2017-05-08 20:42
下一篇 2017-05-08 21:32

相關推薦

  • N26 第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@localhost ~]# useradd tom [root@localhost ~]# echo "123456" | passwd –st…

    Linux干貨 2017-01-20
  • 課堂練習及課后作業(0805文本處理工具)

    課堂練習: 1、找出ifconfig命令結果中本機的所有IPv4地址 2、查出分區空間使用率的最大百分比值 3、查出用戶UID最大值的用戶名、UID及shell類型 4、查出/tmp的權限,以數字方式顯示 5、統計當前連接本機的每個遠程主機IP的連接數,并按從大到小排序 grep 1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式…

    Linux干貨 2016-08-07
  • N25_第二周博客作業:

    N25_第二周博客作業: 1、linux上的文件管理命令都有哪些,其常用的使用方法及其相關示例演示。 Linux上常見的文件管理類命令有mkdir、touch、cp、mv、rm、stat。 mkdir:創建新目錄 SYNOPSIS   mkdir [OPTION]… DIRECTORY… 常用: 1、直接建目錄 [root@…

    Linux干貨 2016-12-09
  • SHELL腳本編程之變量的種類

    變量 在進行腳本編程的時候,經常會使用到不同類型的變量,根據變量的生效范圍,可大致分為以下的幾類: 本地變量:生效范圍為當前shell進程,對當前shell之外的其他shell進程,包括當前shell進程的子shell進程都是無效的,它的作用域就是當前shell進程 環境變量:生效范圍是當前shell進程及其子進程 局部變量:生效范圍是當前shell進程中某…

    Linux干貨 2016-08-12
  • bash的基本特性之globbing,IO重定向及管道

    bash的基本特性之globbing,IO重定向及管道 giobbing:文件名通配 在bash的操作環境中有一個分廠有用的功能那就是gilobbing:文件名通配,這樣我們在處理數據的時候就更方便了。下面我們來羅列一些常用的通配符。(注:globbing是做整體的文件名匹配而非部分) 匹配模式:元字符 *:表示匹配任意長度的任意字符  &nbsp…

    Linux干貨 2016-12-19
  • Linux basics–part2

    一、Linux上的文件管理類命令,及常用的使用方法 1.ls:list, 列出指定目錄下的內容 常用選項: ls: list, 列出指定目錄下的內容 ls [OPTION]… [FILE]… -a: 顯示所有文件,包括隱藏文件; -A:顯示除.和..之外的所有文件; -l: –long, 長格式列表,即顯示文件的詳細屬性信…

    Linux干貨 2017-07-14
欧美性久久久久