MySQL數據庫存儲過程in、out、inout參數講解與實例


   存儲過程是數據庫的一個重要的功能,MySQL 5.0以前並不支持存儲過程,這使得MySQL在應用上大打折扣。好在MySQL 5.0開始支持存儲過程,這樣即可以大大提高數據庫的處理速度,同時也可以提高數據庫編程的靈活性。

MySQL存儲過程的創建

    語法

CREATE PROCEDURE  過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體

 

DELIMITER //
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END
    //
DELIMITER ;

  MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。

    參數

    存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:

IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值OUT:該值可在存儲過程內部被改變,並可返回INOUT:調用時指定,並且可被改變和返回

    過程體

    過程體的開始與結束使用BEGIN與END進行標識。

MySQL實例與講解

1. 創建一存儲過程,求l+2+3+…+n,並打印結果。

先使用MySQL語句創建存儲過程,再使用call語句調用這一存儲過程查看結果,可以看到由於未輸入n的值,sum結果為0。

DELIMITER //
CREATE PROCEDURE addresult()
    BEGIN
    DECLARE i INT;
    DECLARE sum INT;
    DECLARE n INT;

    SET i = 1;
    SET sum = 0;

    WHILE i <= n DO
        SET sum = sum + i;
        SET i = i + 1END WHILE;
    SELECT SUM;
    END
        //
DELIMITER ;

 

在navicat 實現

 

 

 

 2.調用上面的addresult存儲過程,打印l十2+3+…+10的結果。

在第一題的addresult過程基礎上,加上一條“set n=10”語句,設定n的值,調用該過程后打印結果,可以看到結果為sum=1+2+3+...+10=55。

 

 

 

 

3. 修改上述存儲過程為addresult1,使得n為輸入參數,其具體值由用戶調用此存儲過程時指定。

 

 

這是輸入10的結果

也可以這樣寫,這樣更簡潔

 

 

 

 

 

4.調用上面修改后的addresult1存儲過程,打印l+2+3+…+100的結果。

 

 

 

 

 

 

 

 

 

 

5. 修改上述存儲過程為addresult2,將n參數設定默認值為100,並改設sum為輸出參數,讓主程序能夠接收計算結果。

將3中存儲過程中的“in n int”修改為“out sum int”,並在存儲過程中設定n默認值為100。

 

 

 

 

 

 

 

 

 或者手動輸入值

 

 

 

如何接受返回參數的值呢?這里涉及到MySQL的變量

MySQL變量一共有三種:

全局變量

全局變量又叫內置變量,是mysql數據庫內置的變量 ,對所有連接都起作用。

查看所有全局變量: show variables

查看某個全局變量: select @@變量名

修改全局變量: set 變量名=新值

character_set_client: mysql服務器的接收數據的編碼

character_set_results:mysql服務器輸出數據的編碼

會話變量

只存在於當前客戶端與數據庫服務器端的一次連接當中。如果連接斷開,那么會話變量全部丟失!

定義會話變量: set @變量=值

查看會話變量: select @變量

局部變量

在存儲過程中使用的變量就叫局部變量。只要存儲過程執行完畢,局部變量就丟失。

回到上面這個存儲過程,如何接受返回參數的值呢?

定義一個會話變量name, 使用name會話變量接收存儲過程的返回值

CALL pro_testOut(@NAME);

查看變量值

SELECT @NAME;

 

OUT修飾的參數,調用時就是這樣,如果你傳入一個常量,就會報錯

 

 參數inout的使用(既能輸入一個值又能傳出來一個值)

 傳一個年齡,自動讓年齡增長10歲

 

 

 

 

 

怎么OUT呢?例如

@abcd是沒有事先定義的變量,是NULL值

這里直接調用的話也是為NULL

@abc是之前out的值,所以調用加10等於5060

 

 

這樣看會更清晰

定義@ab=1,然后調用加10,得出11,這個也變量可以繼續調用

 

 

 

 

 

 

 

 

 

更多后續參考

 參考:https://blog.csdn.net/weixin_41177699/article/details/80553643?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control

 

 


 

簡單易懂參考

https://blog.csdn.net/xushouwei/article/details/52198065

 

包含函數的也可以參考https://www.jianshu.com/p/f01235e7ea33


免責聲明!

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



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