删除存储过程或者函数
  一次只能删除一个存储过程或者函数,删除存储过程或者函数需要有该过程或者函数的ALTER ROUTINE权限。语法如下:
  DROP{PROCEDURE|FUNCTION} [IF EXISTS] sp_name
  查看存储过程或者函数 查看存储过程或者函数的状态
  SHOW {PROCEDURE|FUNCTION} STATUS [LIKE ‘pattern’]
  查看存储过程或者函数的定义
  SHOW CREATE {PROCEDURE|FUNCTION} sp_name
  通过查看information_schema.Routines了解存储过程和函数的信息
  除了以上两种方法,还可以查看系统表来了解存储过程和函数的相关信息,通过查看information_schema.Routines可以获得存储过程和函数的名称、类型、语法、创建人等信息。
  变量的使用
  存储过程和函数中可以使用变量。
  变量的定义
  通过DECLARE可以定义一个局部变量,该变量的作用范围只能在BEGIN…END块中,可以用在嵌套的块中。变量的定义必须写在复合语句的开头,并且在任何其他语句的前面。可以一次声明多个相同类型的变量。如果需要,可以使用DEFAULT赋默认值。
  定义一个变量的语法如下:
  DECLAREvar_name[,…] type [DEFAULT value]
  例如,定义一个DATE类型的变量,名称是last_month_start:
  DECLARElast_month_start DATE;
  变量的赋值
  变量可以直接赋值,或者通过查询赋值。直接赋值使用SET,可以赋常量或者赋表达式,具体语法如下:
  SET var_name =expr[,var_name=expr]…
  给刚才定义的变量last_month_start赋值,具体语法如下:
  SETlast_month_start = DATE_SUB(CURRENT_DATE(),INTERVAL 1 MONTH);
  也可以通过查询结果将结果赋给变量,这要求查询返回的结果必须只有一行,具体语法如下:
  SELECTcol_name[,…] INTO var_name[,…] table_expr
  示例3:通过查询将结果赋值给变量max_salary。
  DELIMITER $$
  CREATE FUNCTIONget_max_salary(param_deptno INT)
  RETURNS INT(7)
  DETERMINISTIC
  READS SQL DATA
  BEGIN
  DECLAREv_max_salary INT(7);
  SELECT IFNULL(MAX(SALARY),0)INTO v_max_salary
  FROM EMP
  WHEREDEPTNO=param_deptno;
  RETURNv_max_salary;
  END$$
  DELIMITER ;
  存储过程和函数中的异常及处理
  在看到的资料书中都将本小节命名为“条件的定义和处理”。虽然在帮助文档或是语法中使用CONDITION,可以翻译为“条件”,但是,感觉“状态”更为贴切一些。“条件”很容易和“条件语句”之类的混淆。
  状态的定义
  本小节将直接翻译帮助文档,翻译不正确或不地道的地方还请见谅。
  http://dev.mysql.com/doc/refman/5.6/en/declare-condition.html
  DECLARE condition_name CONDITION FOR condition_value
  condition_value:
  mysql_error_code
  |SQLSTATE [VALUE] sqlstate_value
  DECLARE ...CONDITION语句为指定的状态定义一个名称,该名称所代表的状态可以在DECLARE ... HANDLER中进行处理。
  状态的声明必须在游标(cursor)或是处理程序(handler)之前。
  condition_value表示与状态名称(condition_name)关联的特定条件或条件类型。它可以是以下几种类型:
  <1>mysql_error_code: 表示MySQL状态码的整数。
  不要使用状态码0,0代表正常状态而不是异常状态,MySQL状态码列表参考:
  SectionB.3, “ServerError Codes and Messages”
  <2>SQLSTATE [VALUE] sqlstate_value:五个字符的字符串,表示SQL状态。
  不要使用以“00”开头的状态值,以“00”开头的状态值代表正常状态而不是异常状态。参考同上。
  声明状态时,若使用伪装错误信息(SIGNAL或RESIGNAL)时必须使用状态值而不能使用状态码(此规定的原因是伪装信息的定义中不支持为其指定状态码)。
  为状态声明一个名称可以使代码更加清晰(如果不看列表,很难知道状态码1146是什么意思,在上面的连接中能够看到解释,1146 ;ER_NO_SUCH_TABLE ;table ‘%s.%s’ does’t exist,表不存在),假如,处理程序试图删除一张不存在的表,只有当你知道1051代表的是“unknown table”时你才明白错误的原因。
  通过为状态码指定一个名称,才使得处理程序的目的更加明了。
  状态的处理定义
  DECLARE handler_action HANDLER FORcondition_value[,…] sp_statement
  handler_ action:
  CONTINUE|EXIT|UNDO
  condition_value:
  SQLSTATE[VALUE] sqlstate_value
  |condition_name
  |SQLWARNING
  |NOT FOUND
  |SQLEXCEPTION
  |mysql_error_code
  示例4:通过不指定与指定状态处理程序的不同处理熟悉状态处理程序的使用
  <1>向emp(id,ename,deptno)表中连续插入两条记录(1,’张三’,1),(1,’李四’,1)没有处理程序时,id重复的执行结果如下:
  DELIMITER $$
  CREATE PROCEDURE insert_emp()
  BEGIN
  SET @x=1;
  INSERT INTO emp(id,ename,deptno) VALUES(1,'张三',1);
  SET @X=2;
  INSERT INTO emp(id,ename,deptno) VALUES(1,'李四',1);
  SET @X=3;
  END $$
  DELIMITER ;
  CALL insert_emp();
  ERROR 1062 (23000): Duplicate entry '1' forkey 'PRIMARY'
  SELECT @X;
  ->2
  从后的执行结果可以看出,执行到插入emp.ename=李四的记录时,会主键重复并退出,并没有执行到下面的语句。
  <1>向emp(id,ename,deptno)表中连续插入两条记录(1,’张三’,1),(1,’李四’,1)使用处理程序时,id重复的执行结果如下,我们在处理程序加上输出:
  DELIMITER $$
  CREATE PROCEDURE insert_emp()
  BEGIN
  DECLAREduplicate_entry CONDITION FOR SQLSTATE '23000';
  DECLARECONTINUE HANDLER FOR duplicate_entry
  BEGIN
  SELECT'遇到异常继续执行';
  END;
  SET@x=1;
  INSERTINTO emp(id,ename,deptno) VALUES(1,'张三',1);
  SET@X=2;
  INSERTINTO emp(id,ename,deptno) VALUES(1,'李四',1);
  SET@X=3;
  END $$
  DELIMITER ;
  CALL insert_emp();
  ->遇到异常继续执行
  SELECT @x;
  ->3
  调用条件处理的过程,再遇到主键重复的错误时,会按照定义的处理方式进行处理,由于例子中定义的CONTINUE,所以会继续执行下面的语句。
  handler_action在MySQL5.6中还只支持CONTINUE和EXIT两种,CONTINUE表示继续执行下面的语句,EXIT表示执行终止,UNDO还不支持。