MySQL存储过程的三种类型和函数讲义

  

一提到存储过程可能就会引出另一个话题就是存储过程的优缺点,这里也不做讨论,一般别人问我我就这样回答你觉得它好你就用它。因为mysql中存储过程和函数的语法非常接近所以就放在一起,主要区别就是函数必须有返回值(返回),并且函数的参数只在类有型而存储过程有,,INOUT这三种类型。

语法,,

,创建存储过程和函数语法

 mysql存储过程的三种类型和函数讲义

 CREATE  PROCEDURE  sp_name  ([proc_parameter […]])
  ,,,(characteristic …] routine_body
  ,
  CREATE  FUNCTION  sp_name  ([func_parameter […]])
  ,,,RETURNS 类型
  ,,,(characteristic …], routine_body ,,,
  ,,,proc_parameter:
  ,,,(,|拷贝,OUT  |, INOUT ], param_name  type ,,,
  ,,,func_parameter:
  ,,,param_name 类型
  ,
  类型:
  ,,,Any  valid  MySQL  data  type 
  特点:
  ,,,LANGUAGE  SQL
  |才能,(不),确定的
  |才能,{,CONTAINS  SQL  |, NO  SQL  |, READS  SQL  DATA  |, MODIFIES  SQL  DATA }
  |才能,SQL  SECURITY  {, DEFINER  |, INVOKER }
  |才能,COMMENT  & # 39;字符串# 39;
  ,
  routine_body:
  ,,,Valid  SQL  procedure  statement 或是语句

 MySQL存储过程的三种类型和函数讲义

语法来自官方自带的参考手册,语特征法块是需要注意的地方,先用一个例子来介绍。

 MySQL存储过程的三种类型和函数讲义

例子:

 MySQL存储过程的三种类型和函数讲义

 #创建数据库DROP  DATABASE  IF  EXISTS  Dpro; CREATE  DATABASE  DproCHARACTER  SET  utf8
  ;USE  Dpro;
  
  #创建部门表DROP  TABLE  IF  EXISTS 员工;CREATE  TABLE 员工
  (id  INT  NOT  NULL  PRIMARY  KEY  COMMENT  & # 39;主键& # 39;,
  ,name  VARCHAR (20), NOT  NULL  COMMENT  & # 39;人名& # 39;,
  ,depid  INT  NOT  NULL  COMMENT  & # 39;部门id # 39;);
  #插入测试数据INSERT  INTO 员工(id、名称、depid),值(1 & # 39;陈& # 39;,100),(2)& # 39;王& # 39;,101),(3 & # 39;张& # 39;,101),(4日& # 39;李& # 39;,102),(5 & # 39;郭& # 39;,103);
  #创建存储过程DROP  PROCEDURE  IF  EXISTS  Pro_Employee;
  DELIMITER  $ $ CREATE  PROCEDURE  Pro_Employee (pdepid 拷贝;VARCHAR (20), OUT  pcount  INT )
  READS  SQL 数据
  SQL  SECURITY  INVOKERBEGINSELECT 计数(id), INTO  pcount 得到Employee  WHERE  depid=pdepid; $ $
  DELIMITER ;
  #执行存储过程
  CALL  Pro_Employee(101年,@pcount); SELECT  @pcount; 

 MySQL存储过程的三种类型和函数讲义

 MySQL存储过程的三种类型和函数讲义

,语法解释:

在创建存储过程的时候一般都会用分隔符$ $ .....END$$ DELIMITER ;放在开头和结束,目的就是避免mysql把存储过程内部的";"解释成结束符号,最后通过“DELIMITER ;”来告知存储过程结束。

主要解释characteristic部分:

LANGUAGE SQL:用来说明语句部分是SQL语句,未来可能会支持其它类型的语句。

[NOT] DETERMINISTIC:如果程序或线程总是对同样的输入参数产生同样的结果,则被认为它是“确定的”,否则就是“非确定”的。如果既没有给定DETERMINISTIC也没有给定NOT DETERMINISTIC,默认的就是NOT DETERMINISTIC(非确定的)CONTAINS SQL:表示子程序不包含读或写数据的语句。

NO SQL:表示子程序不包含SQL语句。

READS SQL DATA:表示子程序包含读数据的语句,但不包含写数据的语句。

MODIFIES SQL DATA:表示子程序包含写数据的语句。

SQL SECURITY DEFINER:表示执行存储过程中的程序是由创建该存储过程的用户的权限来执行。

SQL SECURITY INVOKER:表示执行存储过程中的程序是由调用该存储过程的用户的权限来执行。(例如上面的存储过程我写的是由调用该存储过程的用户的权限来执行,当前存储过程是用来查询Employee表,如果我当前执行存储过程的用户没有查询Employee表的权限那么就会返回权限不足的错误,如果换成DEFINER如果存储过程是由ROOT用户创建那么任何一个用户登入调用存储过程都可以执行,因为执行存储过程的权限变成了root)

MySQL存储过程的三种类型和函数讲义