MySQL中的存儲過程、函數及簡單應用


1,什么是存儲過程、函數

  存儲過程和函數是從5.0版本開始支持的,兩者在定義上十分類似的,都是事先經過編譯和存儲在數據庫中的SQL語句的集合,就相當於java中的方法。

2,存儲過程、函數的好處

  1,對於開發人員來說,可以極大的簡化他們的工作。

  2,將有關數據的處理都放在了數據庫端,這樣就減少了數據庫和應用服務器之間的傳輸,提高了數據的處理效率。

3,存儲過程和函數的區別

  1,函數必須有返回值,存儲過程沒有。

  2,存儲過程的參數可以是IN,OUT或者INOUT類型,而函數只能是IN類型。

4,存儲過程的小案例

  下面的小案例是在Navicat中實現的。

  寫案例之前先准備一個簡單的表格:

CREATE TABLE `users` (
  `u_id` int(4) NOT NULL AUTO_INCREMENT,
  `u_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `u_age` int(4) DEFAULT NULL,
  PRIMARY KEY (`u_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

 

  

  插入以上幾條數據。

  在Navicat中新建存儲過程的步驟:右擊‘函數’->新建函數->過程->選擇參數->完成

  1,創建一個無參的

CREATE DEFINER=`root`@`localhost` PROCEDURE `noParamName_select`()
BEGIN
    #Routine body goes here...
    select u_name as '用戶名' from users where u_id = 1;
END

 

  我們只需要寫BEGIN和END之間的代碼就好了,其他的Navicat會為我們創建好。

#無參
call noParamName_select();#調用方式是用call關鍵字

 

 

  2,IN類型參數

CREATE DEFINER=`root`@`localhost` PROCEDURE `inParamName_select`(IN `user_id` int)
BEGIN
    #Routine body goes here...
    select u_name as '用戶名' from users where u_id = user_id;
END

 

  改過程的作用是根據輸入的用戶id,查詢對應的用戶名

#IN參數
call inParamName_select(2);

 

  3,OUT類型參數

CREATE DEFINER=`root`@`localhost` PROCEDURE `outParamName_select`(OUT `user_name` varchar(20))
BEGIN
    #Routine body goes here...
    select u_name into user_name from users where u_id = 2;
END

 

  這里要注意,形參類型把varchar后面一定要加長度,否則就會出現錯誤

#OUT參數查id
call outParamId_select(@a);
select @a;

 

  對於OUT類型的參數,在調用函數時也要傳參,使用@開頭,因為OUT類型的參數的是作為輸出,所以最后使用select進行查詢。

  4,IN類型參數和OUT類型參數一起用

CREATE DEFINER=`root`@`localhost` PROCEDURE `inAndOutParamName_select`(IN `user_id` int,OUT `user_name` varchar(20))
BEGIN
    #Routine body goes here...
    select u_name into user_name from users where u_id = user_id;
END

 

#同時使用IN和OUT參數查詢用戶名
call inAndOutParamName_select(1,@n);
select @n as '用戶名';

 

  5,INOUT參數,既作為輸入又作為輸出。

BEGIN
    #Routine body goes here...
    set @number = num; #設置變量
    select @number + 10 into num;
END
#INOUT參數
set @num = 2;
call inoutParamName_select(@num);
select @num;

 


免責聲明!

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



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