创建存储过程语法:
generate_requirement是我的存储过程的名字,大家需要自定义的
我的存储过程需要两个输入参数needNewTemplateCode 、requireName ,大家视具体情况处理,
除了IN参数还可以有OUT输出参数。
DELIMITER $$
DROP PROCEDURE IF EXISTS generate_requirement$$
CREATE PROCEDURE generate_requirement(IN needNewTemplateCode int,IN requireName VARCHAR(30))
BEGIN
-- 你的业务处理代码(包含定义变量,游标等等操作)
END$$
DELIMITER ;
整个存储过程无论多长的处理过程,一定注意所有变量,和sql语句涉及的列名不可出现重复值,实力被名字坑了一回……
DELIMITER :其中DELIMITER 定好结束符为"$$", 然后最后又定义为";", MYSQL的默认结束符为";"
主要应用于命令行中,因为mysql命令号以分号结束一个操作,如下所示:
mysql> select * from test_table;
如果不想只是执行一句话,而是执行多个以分号结尾的语句,则使用DELIMITER,事先把分号替换成其他符号,最后DELIMITER; 向mysql提交执行
declare声明的变量游标全部定义在起始位置,declare之间不能有其他操作数据库的SQL
定义游标语法:
DECLARE CURSOR_NAME CURSOR FOR SELECT 列一,列二,列三 FROM TABLE;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE;
-- 打开游标 CURSOR_NAME
OPEN CURSOR_NAME;
LOOP_NAME:LOOP
FETCH CURSOR_NAME INTO 变量一,变量二,变量三;
IF DONE = 1 THEN
LEAVE LOOP_NAME;
END IF;
-- 亲们的处理脚本
END LOOP LOOP_NAME;
CLOSE CURSOR_NAME;
如果是多个cursor ,中间需要重置 done标识的值
set done = 0;
当然了,游标也可以嵌套使用;
遍历也不止loop这一种方式,还可以用WHILE DO循环、REPEAT循环;
还有一个小坑:如果在游标之间的处理脚本,查出了NULL值会退出循环结束脚本,所以尽量避免查出NULL值