一提到存储过程可能就会引出另一个话题就是存储过程的优缺点,这里也不做讨论,一般别人问我我就这样回答你觉得它好你就用它。因为mysql中存储过程和函数的语法非常接近所以就放在一起,主要区别就是函数必须有返回值(返回),并且函数的参数只在类有型而存储过程有,,INOUT这三种类型。
语法,,
,创建存储过程和函数语法
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 或是语句
语法来自官方自带的参考手册,语特征法块是需要注意的地方,先用一个例子来介绍。
例子:
#创建数据库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;
,语法解释:
在创建存储过程的时候一般都会用分隔符$ $ .....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)