Mysql 存储过程实例详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 存储过程实例详解相关的知识,希望对你有一定的参考价值。

存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,存储和和函数的区别在于函数必须有返回值,而存储过程没有,存储过程的参数可以使用IN、OUT、INOUT类型,而函数的参数只能是IN类型。存储过程再简单点来说,就是为以后的使用而保存的一条或多条mysql语句的集合。可将其视为批件,虽然它们的作用不仅限于批处理。在我看来, 存储过程就是有业务逻辑和流程的集合, 可以在存储过程中创建表,更新数据, 删除等等。本次博客就来讲一下存储过程

存储过程的操作

语法如下:

创建:
CREATE PROCEDURE sp_name([proc_parameter[,...]])
    [characteristic...] routine_body
    
proc_parameter:
[IN|OUT|INOUT] param_name type    #type: Any valid MySQL data type
characteristic:
LANGUAGE SQL
|[NOT] DETERMINISTIC|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}|SQL SECURITY {DEFINAER|INVOKER}|COMMENT string
routine_body:
Valid SQL procedure statement or statements

修改:
ALTER PROCEDURE sp_name [characteristic...]
characteristic:
{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}|SQL SECURITY {DEFINAER|INVOKER}|COMMENT string

调用:
CALL sp_name([parameter[,...]])

删除:
DROP PROCEDURE sp_name

查看:
show PROCEDURE STATUS [like ‘pattern‘]
SHOW CREATE PROCEDURE sp_name

MySQL的存储过程和函数中允许包含DDL语句,也允许在存储过程中执行提交或者回滚,但是存储过程和函数不允许执行LOAD DATA INFILE语句,存储过程和函数可以调用其他的过程或者函数。

插入小知识点@:

1.用户变量:以"@"开始,形式为"@变量名"
用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效。
2.全局变量:定义方式 set GLOBAL 变量名  或者  set @@global.变量名 
对所有客户端生效,只有具有super权限才可以设置全局变量。

存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件,虽然它们的作用不仅限于批处理。

在我看来, 存储过程就是有业务逻辑和流程的集合, 可以在存储过程中创建表,更新数据, 删除等等。

为什么要使用存储过程

  1. 通过把处理封装在容易使用的单元中,简化复杂的操作(正如前面例子所述)。
  2. 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和测试)存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。
  3. 简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。

users表如下:

技术分享

创建存储过程,传入性别(男或女),显示对应性别的用户id,返回对应性别的人数(我的是在mysql front中操作):

#DELIMITER $$
CREATE PROCEDURE user_procedure(IN sex VARCHAR(2) character set utf8,OUT num INT)
BEGIN
    SELECT  id FROM users WHERE gender=sex;
    SELECT FOUND_ROWS() INTO num;   
END #$$
#DELIMITER ;

如果大家用的navicat版本,应该改成是:

DELIMITER $$
CREATE PROCEDURE user_procedure(IN sex VARCHAR(2) character set utf8,OUT num INT)
BEGIN
    SELECT  id FROM users WHERE gender=sex;
    SELECT FOUND_ROWS() INTO num;   
END $$
DELIMITER ;

上面记得中文字符字段,一定要设置编码:character set utf8,这里自己被坑了好久才觉悟过来...

调用

CALL user_procedure(,@num);
select @num;

技术分享

定义条件和处理

 条件的定义和处理可以用来定义在处理过程中遇到问题时相应的处理步骤。

 语法如下:

条件定义:
DECLARE condition_name CONDITION FOR condition_value

condition_value:
    SQLSTATE [VALUE] sqlstate_value
    |mysql_error_code
条件处理:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

handler_type:
    CONTINUE|EXIT|UNDO

condition_value:
     SQLSTATE [VALUE] sqlstate_value
     |condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code

继续用users举个例子吧!
现在有表如下:

技术分享

(1)当没有进行条件处理的时候:

#delimiter $$
create procedure user_insert()
begin
set @x=1;
insert into users(id,gender,name) values(1,,常贵);
set @x=2;
insert into users(gender,name) values(,大脚);
set @x=3;
END #$$

技术分享

上面的例子可以看出,当插入id=1,主键重复了,直接退出了,并没有执行余下的语句,所以@x的值为1。

技术分享

好吧 ,先写在这里吧。。要出去遛娃了哦.....未完待续...


以上是关于Mysql 存储过程实例详解的主要内容,如果未能解决你的问题,请参考以下文章

Java调用SQL Server的存储过程详解(转)

简单sql存储过程实例、储过程实战

Postgres-存储过程 return 详解

mysql存储过程不等于怎么写

mysql 使用存储过程实现求1-100之间的偶数之和的功能

mysql 存储过程提示错误!!求高人解答