delimiter $ create PROCEDURE phoneDeal() BEGIN DECLARE id varchar(64); -- id DECLARE phone1 varchar(16); -- phone DECLARE password1 varchar(32); -- 密码 DECLARE name1 varchar(64); -- id -- 遍历数据结束标志 DECLARE done INT DEFAULT FALSE; -- 游标 DECLARE cur_account CURSOR FOR select phone,password,name from account_temp; -- 将结束标志绑定到游标 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 打开游标 OPEN cur_account; -- 遍历 read_loop: LOOP -- 取值 取多个字段 FETCH NEXT from cur_account INTO phone1,password1,name1; IF done THEN LEAVE read_loop; END IF; -- 你自己想做的操作 insert into account(id,phone,password,name) value(UUID(),phone1,password1,CONCAT(name1,'的家长')); END LOOP; CLOSE cur_account; END $
ALTER PROCEDURE num_from_employee MODIFIES SQL DATA SQL SECURITY INVOKER ;
将读写权限改为READS SQL DATA,并加上注释信息’FIND NAME’。
1 2 3
ALTER PROCEDURE name_from_employee READS SQL DATA COMMENT 'FIND NAME' ;
存储过程删除
1
DROP PROCEDURE [过程1[,过程2…]]
从MySQL的表格中删除一个或多个存储过程。
存储过程控制语句
条件语句
IF-THEN-ELSE语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#条件语句IF-THEN-ELSE DROP PROCEDURE IF EXISTS proc3; DELIMITER // CREATE PROCEDURE proc3(IN parameter int) BEGIN DECLARE var int; SET var=parameter+1; IF var=0 THEN INSERT INTO t VALUES (17); END IF ; IF parameter=0 THEN UPDATE t SET s1=s1+1; ELSE UPDATE t SET s1=s1+2; END IF ; END ; // DELIMITER ;
CASE-WHEN-THEN-ELSE语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#CASE-WHEN-THEN-ELSE语句 DELIMITER // CREATE PROCEDURE proc4 (IN parameter INT) BEGIN DECLARE var INT; SET var=parameter+1; CASE var WHEN 0 THEN INSERT INTO t VALUES (17); WHEN 1 THEN INSERT INTO t VALUES (18); ELSE INSERT INTO t VALUES (19); END CASE ; END ; // DELIMITER ;
循环语句
WHILE-DO…END-WHILE
1 2 3 4 5 6 7 8 9 10 11 12
DELIMITER // CREATE PROCEDURE proc5() BEGIN DECLARE var INT; SET var=0; WHILE var<6 DO INSERT INTO t VALUES (var); SET var=var+1; END WHILE ; END; // DELIMITER ;
REPEAT…END REPEAT
此语句的特点是执行操作后检查结果
1 2 3 4 5 6 7 8 9 10 11 12 13
DELIMITER // CREATE PROCEDURE proc6 () BEGIN DECLARE v INT; SET v=0; REPEAT INSERT INTO t VALUES(v); SET v=v+1; UNTIL v>=5 END REPEAT; END; // DELIMITER ;
LOOP…END LOOP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
DELIMITER // CREATE PROCEDURE proc7 () BEGIN DECLARE v INT; SET v=0; LOOP_LABLE:LOOP INSERT INTO t VALUES(v); SET v=v+1; IF v >=5 THEN LEAVE LOOP_LABLE; END IF; END LOOP; END; // DELIMITER ;
LABLES标号
标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
#ITERATE DELIMITER // CREATE PROCEDURE proc8() BEGIN DECLARE v INT; SET v=0; LOOP_LABLE:LOOP IF v=3 THEN SET v=v+1; ITERATE LOOP_LABLE; END IF; INSERT INTO t VALUES(v); SET v=v+1; IF v>=5 THEN LEAVE LOOP_LABLE; END IF; END LOOP; END; // DELIMITER ;