在上面的示例中嵌套了BEGIN…END内部的BEGIN…END末尾要使用定义的DELIMITER($$),这点需要注意,如果使用后面的;结尾则会视为结束,造成创建失败。
  光标的使用
  在存储过程和函数中,可以使用光标对结果集进行循环的处理,光标的使用包括光标的声明,OPEN、FETCH和CLOSE,其语法分别如下:
  <1>声明光标
  DECLARE cursor_name CURSOR FORselect_statement
  <2>打开光标
  OPEN cursor_name
  <3>使用光标
  FETCH cursor_name INTO var_name[,var_name]…
  <4> 关闭光标
  CLOSE cursor_name
  示例5:对emp表按照行进行循环的处理,按照deptno的不同累加salary的值,判断循环结束的条件是NOT FOUND的状态,当FETCH光标找不到下一条记录的时候,会关闭光标然后退出程序。
  DELIMITER $$
  CREATE PROCEDURE dept_salary_sum()
  BEGIN
  DECLAREi_dept_no int;
  DECLAREi_salary int(5);
  DECLAREcur_emp CURSOR FOR SELECT deptno,salary FROM emp;
  DECLAREEXIT HANDLER FOR NOT FOUND CLOSE cur_emp;
  SET@salary_sum_dept1=0;
  SET@salary_sum_dept2=0;
  OPENcur_emp;
  REPEAT
  FETCHcur_emp INTO i_dept_no,i_salary;
  IFi_dept_no=1 THEN
  SET@salary_sum_dept1=@salary_sum_dept1+i_salary;
  ELSE
  SET@salary_sum_dept2=@salary_sum_dept2+i_salary;
  ENDIF;
  UNTIL0 END REPEAT;
  CLOSEcur_emp;
  END $$
  DELIMITER ;
  CALL dept_salary_sum();
  SELECT @salary_sum_dept1,@salary_sum_dept2;
  ->50000 27000
  注意:变量,状态,处理程序,光标都是通过DECLARE定义的,他们之间是有先后顺序要求的。变量和状态必须在前面声明,然后才能是光标的声明,后才可以是处理程序的声明。
  流程控制
  可以使用IF、CASE、LOOP、LEAVE、ITERATE、REPEAT及WHILE语句进行流程的控制。详细说明及示例参考对应版本的官网。5.6版本:
  http://dev.mysql.com/doc/refman/5.6/en/flow-control-statements.html
  IF语句
  IF search_condition THEN statement_list
  [ELSEIF search_condition THEN statement_list] ...
  [ELSE statement_list]
  END IF
  CASE语句
  CASE case_value
  WHEN when_value THEN statement_list
  [WHEN when_value THEN statement_list] ...
  [ELSE statement_list]
  END CASE
  或者
  CASE
  WHEN search_condition THEN statement_list
  [WHEN search_condition THEN statement_list] ...
  [ELSE statement_list]
  END CASE
  上面光标的例子中,IF语句也可以使用CASE语句来完成:
  CASE
  WHEN i_dept_no =1 THEN
  SET@salary_sum_dept1=@salary_sum_dept1+i_salary;
  ELSE
  SET@salary_sum_dept2=@salary_sum_dept2+i_salary;
  END CASE;
  或者:
  CASE i_dept_no
  WHEN 1 THEN
  SET@salary_sum_dept1=@salary_sum_dept1+i_salary;
  ELSE
  SET @salary_sum_dept2=@salary_sum_dept2+i_salary;
  END CASE;
  LOOP语句
  [begin_label:] LOOP
  statement_list
  END LOOP [end_label]
  LOOP实现简单的循环,退出循环的条件需要使用其它的语句定义,通常可以使用LEAVE语句实现。如果不在statement_list中增加退出循环的语句,那么LOOP语句可以用来实现简单的死循环。
  示例6:简单LOOP循环
  CREATE PROCEDURE doiterate(p1 INT)
  BEGIN
  label1: LOOP
  SETp1 = p1 + 1;
  IFp1 < 10 THEN
  ITERATE label1;
  ENDIF;
  LEAVE label1;
  ENDLOOP label1;
  SET@x = p1;
  END;
  LEAVE语句
  LEAVE label
  用来从标注的流程构造中退出,通常和BEGIN…END或者循环一起使用。如上面的例子。
  ITERATE语句
  ITERATE label
  ITERATE语句必须用在循环中,作用是跳过当前循环的剩下的语句,直接进入下一轮循环。如上面的例子。
  REPEAT语句
  [begin_label:] REPEAT
  statement_list
  UNTIL search_condition
  END REPEAT [end_label]
  有条件的循环控制语句,当满足条件的时候退出循环。在示例5中使用REPEAT语句来实现光标的循环获得。