mysql存储过程、游标(2018.10.08)

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

猜你喜欢

转载自blog.csdn.net/oneeyear/article/details/82971509