当前位置:Gxlcms > 数据库问题 > Mysql 存储过程实例详解

Mysql 存储过程实例详解

时间:2021-07-01 10:21:17 帮助过:11人阅读

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 存储过程实例详解

标签:cal   limit   users   insert   character   完整   客户   glob   status   

人气教程排行