MySQLストアド・プロシージャの簡単な使い方
4532 ワード
シナリオ1:ストレージ・プロシージャを使用した簡単な4つの演算
3つの整形パラメータを入力して、彼らの和を求めて、3番目のパラメータを返します
呼び出し方法
結果を返す:resultという1つの単一行のテーブル
それ以外に、直接selectの後ろで4則の演算についてもいいです.以下のようにします.
シナリオ2:テーブルを調べた後に得たデータを返して、極めて大きい柔軟性を持って、何度も検索した後に4つの演算を行います
例えば先生の時計と学生の時計の総行数の和を求めます
呼び出し方法
残念ながらselectを使用して直接加算すると、サブテーブルごとに単一の列しか使用できません.
シナリオ3:ループ操作
例えば1つの数を入力して、この数をループして出力します
呼び出し方法:
if文を必要とせず、呼び出し方法が上記と同じであるループ文repeatもあります.
もう一つのdo while文もありますが、使い方もあまり悪くありません.
シナリオ4:多層ifネスト
2つのパラメータabを伝え、1つのパラメータcはどのような方法を実行するかを判断するために用いられ、c=0でabの中の大きいものを取り出し、c=1でabの差を計算する
シナリオ5:ストアド・プロシージャの例外処理
呼び出し方法:
エラーが発生した場合、結果は単一行の値を返します:'エラー'
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();
エラーが発生した場合、結果は単一行の値を返します:'エラー'