MySQLストアド・プロシージャの簡単な使い方

4532 ワード

シナリオ1:ストレージ・プロシージャを使用した簡単な4つの演算
3つの整形パラメータを入力して、彼らの和を求めて、3番目のパラメータを返します
DELIMITER $$

USE `school`$$ !--     

DROP PROCEDURE IF EXISTS `proc_2`$$ !--          

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_2`(a INT,b INT,INOUT c INT)
BEGIN
            SET c=a+b+c;
            
        END$$

DELIMITER ;

呼び出し方法
SET @c  = 9; !--    
CALL proc_2(20,30,@c);
SELECT @c AS result;

結果を返す:resultという1つの単一行のテーブル
それ以外に、直接selectの後ろで4則の演算についてもいいです.以下のようにします.
SET @c = 0;
SET @b = 2;
SET @a = 1;
SELECT @a+@b+@c AS result;

シナリオ2:テーブルを調べた後に得たデータを返して、極めて大きい柔軟性を持って、何度も検索した後に4つの演算を行います
例えば先生の時計と学生の時計の総行数の和を求めます
DELIMITER $$

USE `school`$$

DROP PROCEDURE IF EXISTS `proc1`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc1`(OUT c INT)
BEGIN			DECLARE a INT ; !--        
			DECLARE b INT ; !--        
			SELECT COUNT(*)INTO a  FROM teachers ; !--          
			SELECT COUNT(*)INTO b  FROM students;
			SET c = a+b;
		END$$

DELIMITER ;

呼び出し方法
SET @c = 0;
CALL proc1(@c);
SELECT @c AS result;
それ以外にselectで直接加算することもできます
SELECT (SELECT COUNT(*) FROM teachers)+(SELECT COUNT(*)FROM students) AS result;

残念ながらselectを使用して直接加算すると、サブテーブルごとに単一の列しか使用できません.
シナリオ3:ループ操作
例えば1つの数を入力して、この数をループして出力します
DELIMITER $$

USE `school`$$

DROP PROCEDURE IF EXISTS `procloop`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `procloop`(INOUT a INT) !--    INOUT  ,     a       ,          
BEGIN
            lp:LOOP
            SET a=a+1;        
            IF(a>6) THEN !--    
            LEAVE lp;!--     
            END IF;
            END LOOP;
        END$$

DELIMITER ;

呼び出し方法:
SET @a = 1;
CALL procloop(@a);
SELECT @a;

if文を必要とせず、呼び出し方法が上記と同じであるループ文repeatもあります.
DELIMITER $$
DROP PROCEDURE IF EXISTS `school`.`procloop`$$
CREATE PROCEDURE `school`.`procloop`(INOUT a INT)
    	BEGIN
			w1:REPEAT
			SET a=a+1;
			UNTIL a>6 !-- repeate  if  
			END REPEAT;
		END$$

DELIMITER ;

もう一つのdo while文もありますが、使い方もあまり悪くありません.
DELIMITER $$
DROP PROCEDURE IF EXISTS `school`.`procloop`$$
CREATE PROCEDURE `school`.`procloop`(INOUT a INT)
    	BEGIN
			w1:WHILE(a<6) DO
			SET a=a+1;
			END WHILE;
	END$$

DELIMITER ;

シナリオ4:多層ifネスト
2つのパラメータabを伝え、1つのパラメータcはどのような方法を実行するかを判断するために用いられ、c=0でabの中の大きいものを取り出し、c=1でabの差を計算する
DELIMITER $$
DROP PROCEDURE IF EXISTS `school`.`proc1`$$
CREATE PROCEDURE `school`.`proc1`(a INT,b INT,method INT,OUT c INT)
        BEGIN
        IF (method=0) THEN
            IF(a>b) THEN
            SET c=a;
            
            ELSE IF (a<b) THEN
            SET c=b;
            ELSE 
            SET c=b;
            END IF;
            END IF;
        
        ELSE IF(method=1)THEN
            IF(a>b) THEN
            SET c=a-b;
            
            ELSE IF (a<b) THEN
            SET c=b-a;
            ELSE 
            SET c=0;
            END IF;
            END IF;
        END IF;!-- else if   end if
        END IF;
    END$$

DELIMITER ;

シナリオ5:ストアド・プロシージャの例外処理
DELIMITER $$

USE `school`$$

DROP PROCEDURE IF EXISTS `proc1`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc1`()
BEGIN
            
            DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
                BEGIN
                    DECLARE haha VARCHAR(20) ;
                    SET haha='   ';
                    INSERT INTO teachers(teacher_name,teacher_id)VALUES('    ',NULL);
                    SELECT haha;
                END;
            !-- HANDLER            
            INSERT INTO teachers(teacher_name,teacher_id)VALUES(1,2025); !--              ,  ,             , int      0
        END$$

DELIMITER ;

呼び出し方法:
CALL proc1();

エラーが発生した場合、結果は単一行の値を返します:'エラー'