DROP PROCEDURE IF EXISTS GetAllActicle;#存储过程存在删除
 CREATE PROCEDURE GetAllActicle()#声明存储过程
     BEGIN #开始
         #主体
         DECLARE total_sale INT DEFAULT 0;#声明变量
         SET total_sale = 10;#分配变量值
         SELECT * FROM axdrice_article;
     END; #结束CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))
     #IN用法 定义IN参数时,调用程序必须将参数传递给存储过程
     BEGIN
         SELECT * FROM offices WHERE country = countryName;
     END#调用
 CALL GetOfficeByCountry('USA');CREATE PROCEDURE CountOrderByStatus(OUT total INT)
     #OUT - 可以更改OUT参数的值,并将其更改后新值传递回调用程序
   #存储过程在启动时无法访问OUT参数的初始值。
     BEGIN
         SELECT COUNT(orderNumber) INTO total FROM orders;
     END#调用
 CALL CountOrderByStatus(@total);
 SELECT @total;CREATE PROCEDURE set_counter(INOUT count INT(4))
     #INOUT - INOUT参数是IN和OUT参数的组合.可以传递参数,并且存储过程可以修改INOUT参数并将新值传递回调用程序。
     BEGIN
         SET count = count + 1;
     END#调用
     SET @counter = 1;
     CALL set_counter(@counter);
     SELECT @counter;#可以多值输入IN/输出OUT/INOUT
#条件语句
 IF expression THEN 
    statements;
 END IF;IF expression THEN
    statements;
 ELSE
    else-statements;
 END IF;IF expression THEN
    statements;
 ELSEIF elseif-expression THEN
    elseif-statements;
 ...
 ELSE
    else-statements;
 END IF;CASE  case_expression
    WHEN when_expression_1 THEN commands
    WHEN when_expression_2 THEN commands
    ...
    ELSE commands
 END CASE;#循环
 WHILE expression DO
    statements
 END WHILEREPEAT
  statements;
 UNTIL expression
 END REPEAT

#要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理每行
#MySQL游标为只读,不可滚动和敏感.
#只读:无法通过光标更新基础表中的数据
#不可滚动:只能按照SELECT语句确定的顺序获取行,不能跳过行或跳转到结果集中的特定行
#敏感游标和不敏感游标.敏感游标指向实际数据,不敏感游标使用数据的临时副本.敏感游标比一个不敏感的游标执行得更快,因为它不需要临时拷贝数据
DECLARE语句声明游标:DECLARE cursor_name CURSOR FOR SELECT_statement;
SQL游标声明必须在变量声明之后
使用OPEN语句打开游标
OPEN cursor_name;
使用FETCH语句来检索光标指向的下一行,并将光标移动到结果集中的下一行
FETCH cursor_name INTO variables list;
调用CLOSE语句来停用光标并释放与之关联的内存:
CLOSE cursor_name;
 

创建新存储函数的最简单语法:
CREATE FUNCTION function_name(param1,param2,…)
    RETURNS datatype
   [NOT] DETERMINISTIC
 statements
在CREATE FUNCTION子句之后指定存储函数的名称
列出括号内存储函数的所有参数. 默认所有参数均为IN参数.不能为参数指定IN,OUT或INOUT修饰符
必须在RETURNS语句中指定返回值的数据类型,它可以是任何有效的MySQL数据类型
对于相同的输入参数,如果存储的函数返回相同的结果,这样则被认为是确定性的,否则存储的函数不是确定性的.必须决定一个存储函数是否是确定性的.
如果您声明不正确则存储的函数可能会产生意想不到的结果,或者不使用可用的优化,从而降低性能
将代码写入存储函数的主体中,它可以是单个语句或复合语句.
在主体部分中必须至少指定一个RETURN语句.RETURN语句用于返回一个值给调用者.每当到达RETURN语句时,存储的函数的执行将立即终止