存储过程,可以这样认为,将我们需要特殊处理的sql语句封装成函数,当需要的时候我们只需调用这个函数就可以实现我们想要的操作,这个过程我们可以称之为存储过程。当然了,真正存储过程的定义不是这样的。但是我们可以这样简单的去理解存储过程。
下面我们看一个简单的使用存储过程的例子。
首先我们新建一张表 proced:
create table proced( id int(5) primary key auto_increment, name varchar(50), type varchar(50) );
然后我们需要向这个表中插入10万条数据,这个时候我们需要借助存储过程来实现这一功能。
mysql> delimiter // mysql> create procedure adddata() -->begin -->declare n int default 0; -->while n<100000 -->do -->insert into proced(name,type) values(‘迹忆博客','onmpw'); -->set n = n+1; -->end while; -->end -->// mysql> delimiter ; mysql> call adddata();
使用上述存储过程,我们就可以向proced表中插入10万条数据了。
借助上述小例子,我们来讲一下如何创建一个存储过程。
创建存储过程
首先我们来看一下创建存储过程的语法:
CREATE PROCEDURE procedure_name(IN/OUT/INOUT parameter TYPE) BEGIN procedure_body END
这个过程比较简单。
在上面的小例子中我们看到在创建存储过程之前使用了delimiter //;,创建完成之后又再次 使用了命令 delimiter ;。
delimiter 是界定符,我们知道,在mysql命令行客户端,是通过分号(;)来界定一个命令是否完成的。在存储过程中,我们会多次使用到分号,但是这并不代表命令的结束,所以说我们需要使用delimiter命令来改变这个界定符。
mysql> delimiter //; 改变界定符为 // mysql> delimiter ; 重新改变界定符为分号
所以说我们如果使用mysql命令行创建存储过程的话,我们必须在创建存储过程之前使用上述命令改变界定符。
接下来我们看到procedure_name()中的IN/OUT/INOUT,这是代表什么意思呢?
一个IN类型的参数会传递一个值到存储哦过程中,也就是我们在编程语言中自定义函数的参数。如果参数前面没有指定是IN/OUT/INOUT,那默认会是IN,看下面的例子:
mysql>delimiter // mysql> create procedure in_proced(IN param VARCHAR(100)) -->begin -->insert into proced(name,type) values(param,'onmpw'); -->end -->// mysql>delimiter ; mysql> call in_proced(‘onmpw.com');
这就是在参数前指定IN的含义。
下面我们看OUT,指定为OUT的参数将从存储过程中传递一个值给调用者,也就是说,OUT可以认为这个参数就是我们自定义函数中的返回值。
mysql> delimiter // mysql> create procedure out_proced(OUT param INT) -->begin -->select count(*) into param from proced; -->end -->// mysql>delimiter ; mysql> call out_proced(@a); mysql>select @a; +------+ | @a | +------+ | 3 | +------+
最后就是INOUT,很明显INOUT指定的参数被调用者初始化,其值在存储过程中可以被修改,并且任何改变对于调用者来说都是可见的。
看下面的例子:
mysql> delimiter // mysql> create procedure inout_proced(INOUT param INT) --> begin --> select count(*) into param from proced where id>param; --> end -->// mysql>delimiter ; mysql>set @a = 3; mysql>call inout_proced(@a); mysql>select @a; 查看变量的值是否改变
以上就是创建一个简单的存储过程的方式。
删除存储过程
删除存储过程的语法:
DROP PROCEDURE IF EXISTS procedure_name
下面是使用实例:
mysql>drop procedure if exists proced;
修改存储过程
存储过程的修改时不能改变存储过程内的sql语句的,只能改变其属性,其语法如下:
ALTER PROCEDURE proc_name [characteristic ...] characteristic: COMMENT 'string' | LANGUAGE SQL | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER }
总结:无论是删除存储过程还是修改存储过程,必须保证你要修改或者删除存储过程没有被其他存储过程使用,例如你有存储过程A,和存储过程B。A在B中被使用,如果我们想修改A或者删除A,必须确保B中不再使用A,否则如果我们删除A以后,再调用B的时候就会报错。
举个例子:
mysql>delimiter // mysql>create procedure A(IN pa1 INT,OUT pa2 INT) -->begin -->select count(*) into pa2 from proced where id>pa1; -->end -->// mysql>create procedure B(INOUT pa INT) -->begin -->declare v int; -->call A(pa,v); -->set pa = v; -->end -->// mysql>delimiter ; mysql>drop procedure A; mysql>set @a=5; mysql>call B(@a); ERROR 1305 (42000): PROCEDURE test.A does not exists
以上就是对存储过程简单的介绍,希望对大家学习mysql存储过程有所帮助。
mysql,存储过程
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]