窥探mysql存储过程细节
存储过程,可以这样认为,将我们需要特殊处理的sql语句封装成函数,当需要的时候我们只需调用这个函数就可以实现我们想要的操作,这个过程我们可以称之为存储过程。当然了,真正存储过程的定义不是这样的。但是我们可以这样简单的去理解存储过程。
下面我们看一个简单的使用存储过程的例子。
首先我们新建一张表proced:
createtableproced( idint(5)primarykeyauto_increment, namevarchar(50), typevarchar(50) );
然后我们需要向这个表中插入10万条数据,这个时候我们需要借助存储过程来实现这一功能。
mysql>delimiter// mysql>createprocedureadddata() -->begin -->declarenintdefault0; -->whilen<100000 -->do -->insertintoproced(name,type)values(‘迹忆博客','onmpw'); -->setn=n+1; -->endwhile; -->end -->// mysql>delimiter; mysql>calladddata();
使用上述存储过程,我们就可以向proced表中插入10万条数据了。
借助上述小例子,我们来讲一下如何创建一个存储过程。
创建存储过程
首先我们来看一下创建存储过程的语法:
CREATEPROCEDUREprocedure_name(IN/OUT/INOUTparameterTYPE) 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>createprocedurein_proced(INparamVARCHAR(100)) -->begin -->insertintoproced(name,type)values(param,'onmpw'); -->end -->// mysql>delimiter; mysql>callin_proced(‘onmpw.com');
这就是在参数前指定IN的含义。
下面我们看OUT,指定为OUT的参数将从存储过程中传递一个值给调用者,也就是说,OUT可以认为这个参数就是我们自定义函数中的返回值。
mysql>delimiter// mysql>createprocedureout_proced(OUTparamINT) -->begin -->selectcount(*)intoparamfromproced; -->end -->// mysql>delimiter; mysql>callout_proced(@a); mysql>select@a; +------+ |@a| +------+ |3| +------+
最后就是INOUT,很明显INOUT指定的参数被调用者初始化,其值在存储过程中可以被修改,并且任何改变对于调用者来说都是可见的。
看下面的例子:
mysql>delimiter// mysql>createprocedureinout_proced(INOUTparamINT) -->begin -->selectcount(*)intoparamfromprocedwhereid>param; -->end -->// mysql>delimiter; mysql>set@a=3; mysql>callinout_proced(@a); mysql>select@a;查看变量的值是否改变
以上就是创建一个简单的存储过程的方式。
删除存储过程
删除存储过程的语法:
DROPPROCEDUREIFEXISTSprocedure_name
下面是使用实例:
mysql>dropprocedureifexistsproced;
修改存储过程
存储过程的修改时不能改变存储过程内的sql语句的,只能改变其属性,其语法如下:
ALTERPROCEDUREproc_name[characteristic...] characteristic: COMMENT'string' |LANGUAGESQL |{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA} |SQLSECURITY{DEFINER|INVOKER}
总结:无论是删除存储过程还是修改存储过程,必须保证你要修改或者删除存储过程没有被其他存储过程使用,例如你有存储过程A,和存储过程B。A在B中被使用,如果我们想修改A或者删除A,必须确保B中不再使用A,否则如果我们删除A以后,再调用B的时候就会报错。
举个例子:
mysql>delimiter// mysql>createprocedureA(INpa1INT,OUTpa2INT) -->begin -->selectcount(*)intopa2fromprocedwhereid>pa1; -->end -->// mysql>createprocedureB(INOUTpaINT) -->begin -->declarevint; -->callA(pa,v); -->setpa=v; -->end -->// mysql>delimiter; mysql>dropprocedureA; mysql>set@a=5; mysql>callB(@a); ERROR1305(42000):PROCEDUREtest.Adoesnotexists
以上就是对存储过程简单的介绍,希望对大家学习mysql存储过程有所帮助。