儲存過程(無參,IN多個輸入引數,OUT多個輸出引數,INOUT輸入輸出)
儲存過程(無參,多個輸入引數,多個輸出引數)
儲存過程:
1、減少編譯次數
2、簡化操作
3、減少了變異次數減少了和資料庫的連結次數,提高效率
關於儲存過程的方法:
1、刪除儲存過程
DROP PROCEDURE 儲存過程的名稱;
2、檢視儲存過程資訊
show create procedure 儲存過程名稱;
3、沒有儲存過程的修改
建立語法:
CREATE PROCEDURE 儲存過程名稱(引數列表) BEGIN 方法體(儲存過程體)一組方法語句; END
⭐⭐⭐⭐注意:引數列表包括三部分
1、引數模式 引數名 引數型別
eg: IN stuname varchar(20)
引數模式
IN : 該引數可以作為輸入,也就是需要呼叫方傳入值
OUT: 該引數作為輸出,也就是該引數可以作為返回值
INOUT: 既可以作為輸入引數,也可以作為輸出引數
2、如果儲存過程提僅僅只有一句話,那麼BEGIN END 可以省略
3、儲存過程中的每一條sql語句的結尾都必須加封號,需要申明結尾符號 DELIMITER 重新設定
以下在建立的過程中使用DELIMITER $開始,DELIMITER ;結束,是因為mysql是以;結束的,此處建立儲存過程的時候需要指定結尾符號為$,整個儲存過程執行完成後,再還原為mysql的結束符;即可
一、空參儲存過程
DELIMITER $ CREATE PROCEDURE test1() BEGIN INSERT INTO admin(username,`password`) VALUES ('JOHN1','000001'); INSERT INTO admin(username,`password`) VALUES ('JOHN2','000002'); INSERT INTO admin(username,`password`) VALUES ('JOHN3','000003'); INSERT INTO admin(username,`password`) VALUES ('JOHN4','000004'); INSERT INTO admin(username,`password`) VALUES ('JOHN5','000005'); END $
呼叫:CALL test1();
二、入參儲存過程(此處直接舉例有多個入參的儲存過程的寫法)
# 示例,查詢是否登陸成功
DELIMITER $
CREATE PROCEDURE testParams(IN username varchar(20),IN password varchar(20))
BEGIN
DECLARE RESULT VARCHAR(20) DEFAULT '';#申明並初始化
select COUNT(1) INTO RESULT #賦值將統計到的count(1) 賦值給RESULT結果
from admin
where admin.username=username #如果引數名相同的話指明引數是那個表的欄位即可
and admin.password=password;
END $
DELIMITER ;
呼叫:call testParams('11','22');
三、多個出參的儲存過程(此處直接舉例有多個出餐的儲存過程的寫法)
#根據女神名,查詢男神名和魅力值
DELIMITER $
CREATE PROCEDURE myp7(IN beautyName varchar(20),OUT boyName VARCHAR(20),OUT userCP varchar(20))
BEGIN
SELECT bo.boyName,bo.userCP INTO boyName,userCP #此處賦值的時候多個直接INTO為對應位置的出參物件即可
FROM boys bo
INNER JOIN beauty b on bo.id=b.boyfriend_id
WHERE
b.name=beautyName;
END $
DELIMITER ;
呼叫:
CALL myp7('小昭',@boyName,@userCP);
#此處儲存過程的兩個入參(也即出參)用@符號定義即可,也可以先定義好傳入到裡面
SELECT @boyName AS boyName,@userCP as userCP #查詢儲存過程執行的結果
四、建立帶有INOUT的儲存過程
#案例 傳入a,b 最終a,b翻倍,並返回
DELIMITER $
CREATE PROCEDURE ccgc(INOUT a int,INOUT b int)
BEGIN
SET a=a*2;
SET b=b*2;
END $
DELIMITER ;
呼叫:
###此處需要提前定義引數值,類似於java的入參,
SET @m=10;
SET @n=30;
call ccgc(@m,@n);
#然後呼叫,並列印輸出
select @m,@n