MYSQL存儲過程&循環&遊標&IF$CASE

測試用表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for stu
-- ----------------------------
DROP TABLE IF EXISTS `stu`;
CREATE TABLE `stu` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `kecheng` varchar(255) DEFAULT NULL,
  `fenshu` int(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of stu
-- ----------------------------
INSERT INTO `stu` VALUES ('1', '張三', '語文', '40');
INSERT INTO `stu` VALUES ('2', '張三', '數學', '60');
INSERT INTO `stu` VALUES ('3', '李四', '數學', '110');
INSERT INTO `stu` VALUES ('4', '李四', '語文', '40');
INSERT INTO `stu` VALUES ('7', '你本來就很二', '德語', '110');
INSERT INTO `stu` VALUES ('8', '王五', '數學', null);
-- 多個out參數的存儲過程

DROP PROCEDURE IF EXISTS moreOutPro;

CREATE PROCEDURE moreOutPro(OUT outParam1 INT, OUT outParam2 INT)

BEGIN
    SELECT id, fenshu INTO outParam1, outParam2 FROM stu LIMIT 1;
END;


-- CALL moreOutPro(@outParam1, @outParam2);
-- SELECT @outParam1, @outParam2;
-- 顯示存儲過程源代碼
-- SHOW CREATE PROCEDURE inPro;
-- while循環

DROP PROCEDURE IF EXISTS while_loop;

CREATE PROCEDURE while_loop(OUT outParam VARCHAR(30))
BEGIN
    DECLARE str VARCHAR(30);
    DECLARE i INT;

    SET str = '';
    SET i = 0;

    WHILE i < 10
    DO
        SET i = i + 1;
        SET str = CONCAT(str,i,' ');
    END WHILE;

    SELECT str;
END;

-- CALL while_loop(@outParam);
-- SELECT @outParam;
-- REPEAT循環

DROP PROCEDURE IF EXISTS repeat_loop;

CREATE PROCEDURE repeat_loop(OUT outParam VARCHAR(30))
BEGIN
    DECLARE str VARCHAR(30);
    DECLARE i INT;

    SET str = '';
    SET i = 0;

    REPEAT
        SET str = CONCAT(str,i,' ');
        SET i = i + 1;
    UNTIL i > 10
    END REPEAT;

    SELECT str;
END;

CALL repeat_loop(@outParam);
SELECT @outParam;
-- loop循環

DROP PROCEDURE IF EXISTS loop_test;

CREATE PROCEDURE loop_test(OUT outParam VARCHAR(30))

BEGIN
    DECLARE i INT;
    DECLARE str VARCHAR(30);

    SET i = 0;
    SET str = '';

    loop_label: LOOP
        IF i > 10 THEN
            LEAVE loop_label;       -- LEAVE語句允許您立即退出循環,而不用等待檢查條件。相當於java/c/c++中的break
        END IF;

        SET i = i + 1;
        IF (i MOD 2) THEN           -- MOD是模運算,即求餘運算,例如 1 MOD 2 = 1, 4 MOD 2 = 0, mysql中1代表true, 0代表false
        ITERATE                             -- ITERATION語句允許您跳過剩下的那些代碼,並重新開始新的迭代.相當於java/c/c++中的continue
            loop_label;
        ELSE
            SET str = CONCAT(str,i,' ');
        END IF;
    END LOOP;

    SELECT str;

END;

-- 
-- CALL loop_test(@outParam);
-- SELECT @outParam;
-- 遊標

DROP PROCEDURE IF EXISTS corPro;
CREATE PROCEDURE corPro()

BEGIN

    DECLARE finished INT DEFAULT 0;

    DECLARE param int;

    DECLARE cor CURSOR FOR SELECT id FROM stu;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

    OPEN cor;

        loop_label: LOOP

            FETCH cor INTO param;

            IF finished = 1 THEN
                LEAVE loop_label;
            END IF;

            UPDATE stu SET fenshu = fenshu * 2 WHERE id = param;

            END LOOP loop_label;

        CLOSE cor;

END;

-- CALL corPro();
-- IFNULL(expr1,expr2)
SELECT id, `name`, IFNULL(fenshu,100) FROM stu;

-- IF(expr1,expr2,expr3)
SELECT id, `name`, IF(fenshu > 80,'優秀','不行啊') FROM stu;
-- IF ELSE

DROP PROCEDURE IF EXISTS ifElsePro;

CREATE PROCEDURE ifElsePro(OUT outParam1 INT, OUT outParam VARCHAR(20))
BEGIN
    SELECT MAX(fenshu) INTO outParam1 FROM stu;

    IF (outParam1 > 90) THEN SET outParam = '優秀';
    ELSEIF (outParam1 > 60) THEN SET outParam = '及格';
    ELSE SET outParam = '不及格';
    END IF;

END;

-- 
-- CALL ifElsePro(@score, @lev);
-- SELECT @score, @lev;
SELECT `name`, kecheng, 
    CASE 
        WHEN fenshu > 90 THEN '優秀'
        WHEN fenshu > 60 THEN '及格'
        ELSE '不及格'
    END fenshu
 FROM stu;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章