season22 发表于 2018-10-9 12:06:07

mysql 5.0存储过程学习总结

  14.1.1 创建存储过程
  MySQL中,创建存储过程的基本形式如下:

[*]  CREATE PROCEDURE sp_name (])
[*]   routine_body
  其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数列表; characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束。
  proc_parameter中的每个参数由3部分组成。这3部分分别是输入输出类型、参数名称和参数类型。其形式如下:

[*]  [ IN | OUT | INOUT ] param_name type
  其中,IN表示输入参数;OUT表示输出参数; INOUT表示既可以是输入,也可以是输出; param_name参数是存储过程的参数名称;type参数指定存储过程的参数类型,该类型可以是MySQL数据库的任意数据类型。
  characteristic参数有多个取值。其取值说明如下:
  LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统默认的语言。
   DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOTDETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。
  { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。
  SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认情况下,系统指定的权限是DEFINER。
  COMMENT 'string':注释信息。
  技巧:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是,如果存储过程中没有使用SQL语句,最好设置为NO SQL。而且,存储过程中最好在COMMENT部分对存储过程进行简单的注释,以便以后在阅读存储过程的代码时更加方便。
  【示例14-1】 下面创建一个名为num_from_employee的存储过程。代码如下:

[*]  CREATEPROCEDUREnum_from_employee (IN emp_id INT, OUT count_num INT )
[*]  READS SQL DATA
[*]  BEGIN
[*]  SELECTCOUNT(*)INTOcount_num
[*]  FROMemployee
[*]  WHEREd_id=emp_id ;
[*]  END
  上述代码中,存储过程名称为num_from_employee;输入变量为emp_id;输出变量为count_num。SELECT语句从employee表查询d_id值等于emp_id的记录,并用COUNT(*)计算d_id值相同的记录的条数,最后将计算结果存入count_num中。代码的执行结果如下:

[*]  mysql> DELIMITER &&
[*]  mysql> CREATEPROCEDUREnum_from_employee
  (IN emp_id INT, OUT count_num INT )
[*]  -> READS SQL DATA
[*]  -> BEGIN
[*]  -> SELECTCOUNT(*)INTOcount_num
[*]  -> FROMemployee
[*]  -> WHEREd_id=emp_id ;
[*]  -> END &&
[*]  Query OK, 0 rows affected (0.09 sec)
[*]  mysql> DELIMITER ;
  代码执行完毕后,没有报出任何出错信息就表示存储函数已经创建成功。以后就可以调用这个存储过程,数据库中会执行存储过程中的SQL语句。
  说明:MySQL中默认的语句结束符为分号(;)。存储过程中的SQL语句需要分号来    结束。为了避免冲突,首先用"DELIMITER &&"将MySQL的结束符设置为&&。最后再用"DELIMITER ;"来将结束符恢复成分号。这与创建触发器时是一样的。
  CREATEPROCEDUREnum_from_employee (IN bid INT, OUT count_num INT )
  BEGIN
  SELECTCOUNT(*)INTOcount_num
  FROMbook
  WHEREbook_id= bid;
  END
  DROPPROCEDURE num_from_employee
  call num_from_employee(1000,@count_num);
  select @count_num
  CREATEPROCEDUREnum_from_book (IN bid INT, OUT count_num INT )
  BEGIN
  DECLARE n INT DEFAULT 0;
  SELECTCOUNT(*)INTOn
  FROMbook
  WHEREbook_id= bid;
  if n=1
  then
  SET count_num=2;
  END IF;
  END
  call num_from_book(1000,@count_num);
  select @count_num

页: [1]
查看完整版本: mysql 5.0存储过程学习总结