1. 程式人生 > >儲存過程(無參,IN多個輸入引數,OUT多個輸出引數,INOUT輸入輸出)

儲存過程(無參,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