设为首页 收藏本站
查看: 1093|回复: 0

[经验分享] mysql 5.0存储过程学习总结

[复制链接]

尚未签到

发表于 2018-10-9 12:06:07 | 显示全部楼层 |阅读模式
  14.1.1 创建存储过程
  MySQL中,创建存储过程的基本形式如下:

  •   CREATE PROCEDURE sp_name ([proc_parameter[,...]])
  •   [characteristic ...] 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语言的语句组成,这也是数据库系统默认的语言。
  [NOT] 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的存储过程。代码如下:

  •   CREATE  PROCEDURE  num_from_employee (IN emp_id INT, OUT count_num INT )
  •   READS SQL DATA
  •   BEGIN
  •   SELECT  COUNT(*)  INTO  count_num
  •   FROM  employee
  •   WHERE  d_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> CREATE  PROCEDURE  num_from_employee
      (IN emp_id INT, OUT count_num INT )
  •   -> READS SQL DATA
  •   -> BEGIN
  •   -> SELECT  COUNT(*)  INTO  count_num
  •   -> FROM  employee
  •   -> WHERE  d_id=emp_id ;
  •   -> END &&
  •   Query OK, 0 rows affected (0.09 sec)
  •   mysql> DELIMITER ;
  代码执行完毕后,没有报出任何出错信息就表示存储函数已经创建成功。以后就可以调用这个存储过程,数据库中会执行存储过程中的SQL语句。
  说明:MySQL中默认的语句结束符为分号(;)。存储过程中的SQL语句需要分号来    结束。为了避免冲突,首先用"DELIMITER &&"将MySQL的结束符设置为&&。最后再用"DELIMITER ;"来将结束符恢复成分号。这与创建触发器时是一样的。
  CREATE  PROCEDURE  num_from_employee (IN bid INT, OUT count_num INT )
  BEGIN
  SELECT  COUNT(*)  INTO  count_num
  FROM  book
  WHERE  book_id= bid;
  END
  DROP  PROCEDURE num_from_employee
  call num_from_employee(1000,@count_num);
  select @count_num
  CREATE  PROCEDURE  num_from_book (IN bid INT, OUT count_num INT )
  BEGIN
  DECLARE n INT DEFAULT 0;
  SELECT  COUNT(*)  INTO  n
  FROM  book
  WHERE  book_id= bid;
  if n=1
  then
  SET count_num=2;
  END IF;
  END
  call num_from_book(1000,@count_num);
  select @count_num


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619585-1-1.html 上篇帖子: CentOS 6.5 i386 安装MySQL 5.7.18 下篇帖子: 如何重置mysql root密码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表