DELIMITER//CREATEPROCEDURE 存储过程名称()BEGINDECLARE done INTDEFAULT0;DECLARE result VARCHAR(1000)DEFAULT'';DECLARE 游标名称 CURSORFORSELECT 行名 FROM 表名;DECLARECONTINUEHANDLERFORNOT FOUND SET done=1;OPEN 游标名称;WHILE done !=1DOFETCH 游标名称 INTO 局部变量[,局部变量...];IF done !=1THENSET result = 业务逻辑;ENDIF;ENDWHILE;CLOSE 游标名称;SELECT result;END//DELIMITER;
3. 案例
3.1 结果作为字符串返回
DELIMITER//CREATEPROCEDURE processorders()BEGINDECLARE result VARCHAR(1000)DEFAULT'';DECLARE done INTDEFAULT0;DECLARE o INT;DECLARE t DECIMAL(8,2);DECLARE ordernumbers CURSORFORSELECT order_num FROM products;DECLARECONTINUEHANDLERFORNOT FOUND SET done=1;OPEN ordernumbers;WHILE done !=1DOFETCH ordernumbers INTO o;IF done !=1THENCALL ordertotal(o,1,t);SET result = CONCAT_WS(',',result ,t);ENDIF;ENDWHILE;CLOSE ordernumbers;SELECT result;END//DELIMITER;
CALL processorders();
3.2 结果保存到新建的表
DELIMITER//CREATEPROCEDURE processorders()BEGIN-- 声明局部变量DECLARE done BOOLEANDEFAULT0;DECLARE o INT;DECLARE t DECIMAL(8,2);-- 声明游标DECLARE ordernumbers CURSORFORSELECT order_num FROM products;-- 声明结束条件DECLARECONTINUEHANDLERFOR SQLSTATE '02000'SET done=1;-- 业务逻辑,创建表CREATETABLEIFNOTEXISTS ordertotals(
order_num INT, total DECIMAL(8,2));-- 打开游标OPEN ordernumbers;-- 逐行读取数据REPEAT-- 获取查询后的行数据FETCH ordernumbers INTO o;-- 执行业务逻辑,调用业务存储过程IF done !=1THENCALL ordertotal(o,1,t);INSERTINTO ordertotals(order_num,total)VALUES(o,t);ENDIF;-- 条件满足则结束读取数据
UNTIL done ENDREPEAT;-- 关闭游标CLOSE ordernumbers;END//DELIMITER;