DELIMITER //
CREATE PROCEDURE procedureName()
BEGIN
--sql语句
END
-- 无变量
CREATE PROCEDURE p1()
BEGIN
SELECT 3+2;
END//
-- 带有变量的
CREATE PROCEDURE p2()
BEGIN
DECLARE age INT DEFAULT 18;
DECLARE height INT DEFAULT 180;
SELECT CONCAT('年龄是',age,'身高是',height);
END//
-- 运算,控制
CREATE PROCEDURE p3()
BEGIN
DECLARE age INT DEFAULT 18;
SET age:= (age + 20);
SELECT CONCAT('20年后的年龄是',age);
END//
-- if控制
/**
if condition then
statement
else
end;
**/
-- 引入表达式
CREATE PROCEDURE p4()
BEGIN
DECLARE age INT DEFAULT 18;
IF age >= 18 THEN
SELECT '已成年';
ELSE
SELECT '未成年';
END IF;
END//
-- 给存储过程传参数
/**
存储过程的括号里可以声明参数,
语法是[in/out/inout] 参数名 参数类型
**/
CREATE PROCEDURE p5(width INT, height INT)
BEGIN
SELECT CONCAT('你的面积是',width * height) AS AREA;
IF width > height THEN
SELECT '你挺胖';
ELSEIF width < height THEN
SELECT '你挺瘦';
ELSE
SELECT '你挺方';
END IF;
END//
-- 控制结构
-- 顺序,选择,循环
-- 求1到100的和
CREATE PROCEDURE p6()
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE num INT DEFAULT 0;
WHILE num < 100 DO
SET num := num + 1;
SET total := total + num;
END WHILE;
SELECT CONCAT('1到100的和为',total);
END//
-- 输入参数,求1到n的和 in型
CREATE PROCEDURE p7(IN n INT)
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE num INT DEFAULT 0;
WHILE num < n DO
SET num := num + 1;
SET total := total + num;
END WHILE;
SELECT CONCAT('1到',n,'的和为',total);
END//
-- p8 out型
CREATE PROCEDURE p8(IN n INT, OUT total INT)
BEGIN
DECLARE num INT DEFAULT 0;
SET total := 0;
WHILE num < n DO
SET num := num + 1;
SET total := total + num;
END WHILE;
END//
-- inout型 变量名
CREATE PROCEDURE p9(INOUT age INT)
BEGIN
SET age := age + 20;
END//
SET @currage = 18;//
CALL p9(@currage);//
SELECT @currage;//
-- case
CREATE PROCEDURE p10()
BEGIN
DECLARE pos INT DEFAULT 0;
SET pos := FLOOR(5 * RAND());
CASE pos
WHEN 1 THEN SELECT '仍在飞';
WHEN 2 THEN SELECT '掉到海里去了';
WHEN 3 THEN SELECT '在地上';
ELSE SELECT '未知!';
END CASE;
END//
-- repeat 循环
/**
repeat
sql1 statement;
sql2 statement;
until condition end repeat;
**/
CREATE PROCEDURE p11()
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
REPEAT
SET i := i + 1;
SET total := total + i;
UNTIL i >= 100 END REPEAT;
SELECT total;
END//
-- 游标 cursor 游标 游标的标志
-- 1条sql,对应N条结果集的资源,取出资源的接口/句柄,就是游标
-- 沿着游标,可以一次取出1行
-- declare 声明; declare 游标名 cursor for select_statement;
-- open 打开; open 游标名
-- fetch 取值; fetch 游标名 into var1,var2[...]
-- close 关闭; close 游标名;
CREATE PROCEDURE p12()
BEGIN
DECLARE row_tid INT;
DECLARE row_tname VARCHAR(20);
DECLARE getteacher CURSOR FOR SELECT tid,tname FROM teacher;
OPEN getteacher;
FETCH getteacher INTO row_tid,row_tname;
SELECT row_tid,row_tname;
CLOSE getteacher;
END//
CREATE PROCEDURE p13()
BEGIN
DECLARE row_tid INT;
DECLARE row_tname VARCHAR(20);
DECLARE getteacher CURSOR FOR SELECT tid,tname FROM teacher;
OPEN getteacher;
FETCH getteacher INTO row_tid,row_tname;
SELECT row_tid,row_tname;
FETCH getteacher INTO row_tid,row_tname;
SELECT row_tid,row_tname;
FETCH getteacher INTO row_tid,row_tname;
SELECT row_tid,row_tname;
CLOSE getteacher;
END//
-- 游标与循环相结合。去除所有值 -用计数器
CREATE PROCEDURE p14()
BEGIN
DECLARE row_tid INT;
DECLARE row_tname VARCHAR(20);
DECLARE cnt INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE getteacher CURSOR FOR SELECT tid,tname FROM teacher;
SELECT COUNT(*) INTO cnt FROM teacher;
OPEN getteacher;
REPEAT
SET i := i + 1;
FETCH getteacher INTO row_tid,row_tname;
SELECT row_tid,row_tname;
UNTIL i >= cnt END REPEAT;
CLOSE getteacher;
END//
-- 游标与循环相结合。去除所有值 -越界标志
-- 游标取值越界时,有没有什么标志?利用标志来结束
-- 在mysql cuesor中,可以declare continue handler 来操作一个越界标志
-- declare continue handler for not found statement;
CREATE PROCEDURE p15()
BEGIN
DECLARE row_tid INT;
DECLARE row_tname VARCHAR(20);
DECLARE you INT DEFAULT 1;
DECLARE getteacher CURSOR FOR SELECT tid,tname FROM teacher;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET you := 0;
OPEN getteacher;
REPEAT
FETCH getteacher INTO row_tid,row_tname;
SELECT row_tid,row_tname;
UNTIL you = 0 END REPEAT;
CLOSE getteacher;
END//
CREATE PROCEDURE p16()
BEGIN
DECLARE row_tid INT;
DECLARE row_tname VARCHAR(20);
DECLARE you INT DEFAULT 1;
DECLARE getteacher CURSOR FOR SELECT tid,tname FROM teacher;
DECLARE EXIT HANDLER FOR NOT FOUND SET you := 0;
OPEN getteacher;
REPEAT
FETCH getteacher INTO row_tid,row_tname;
SELECT row_tid,row_tname;
UNTIL you = 0 END REPEAT;
CLOSE getteacher;
END//
-- 除continue,exit外,还有一种undo handler,
-- continue是触发后,后面的语句继续执行
-- exit是触发后,后面的语句不再执行
-- undo是触发后,前面的语句撤销(但是目前mysql还不支持undo)
CREATE PROCEDURE p17()
BEGIN
DECLARE row_tid INT;
DECLARE row_tname VARCHAR(20);
DECLARE you INT DEFAULT 1;
DECLARE getteacher CURSOR FOR SELECT tid,tname FROM teacher;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET you := 0;
OPEN getteacher;
FETCH getteacher INTO row_tid,row_tname;
REPEAT
SELECT row_tid,row_tname;
FETCH getteacher INTO row_tid,row_tname;
UNTIL you = 0 END REPEAT;
CLOSE getteacher;
END//
CREATE PROCEDURE p18()
BEGIN
DECLARE row_tid INT;
DECLARE row_tname VARCHAR(20);
DECLARE you INT DEFAULT 1;
DECLARE getteacher CURSOR FOR SELECT tid,tname FROM teacher;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET you := 0;
OPEN getteacher;
FETCH getteacher INTO row_tid,row_tname;
WHILE you = 1 DO
SELECT row_tid,row_tname;
FETCH getteacher INTO row_tid,row_tname;
END WHILE;
CLOSE getteacher;
END//
所听课程为燕十八老师的mysql高级视频教程,视频链接:http://www.php.cn/course/197.html
本文链接:https://blog.csdn.net/oneeyear/article/details/82971509