时间:2021-07-01 10:21:17 帮助过:11人阅读
MySQL的存储过程和函数中允许包含DDL语句,也允许在存储过程中执行提交或者回滚,但是存储过程和函数不允许执行LOAD DATA INFILE语句,存储过程和函数可以调用其他的过程或者函数。
插入小知识点@:
1.用户变量:以"@"开始,形式为"@变量名" 用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效。 2.全局变量:定义方式 set GLOBAL 变量名 或者 set @@global.变量名 对所有客户端生效,只有具有super权限才可以设置全局变量。
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件,虽然它们的作用不仅限于批处理。
在我看来, 存储过程就是有业务逻辑和流程的集合, 可以在存储过程中创建表,更新数据, 删除等等。
为什么要使用存储过程
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