MySQL 存储过程
在编写存储过程中会在网上看到一些例子,在例子中会有类似 DELIMITER ??或者DELIMITER //这种写法,这种写法看上去就比较迷惑。
其实含义很简单,就是使用DELIMITER关键字告诉MySQL客户端,判断一条SQL语句是否终止时不要以默认的分隔符;来解析了。用关键字DELIMITER 后面的那个符号来解析,比如??。
在MySQL客户端写完SQL时会以分隔符;来作为一条完整的SQL语句的终止符,比如:
但是在存储过程中会在一个存储过程内写很多以;结束的语句,设置变量,循环,具体的多个SQL语句等都会以;结束,那么就会出现MySQL客户端解析到第一个;就认为这个语句已经写完了,它就发送这条语句给服务端执行这个SQL了。显然这不是期望的,此时解析就会报错。
比如想写一个包含两个查询SQL语句的存储过程。
create procedure selectTwoSQL()beginselect * from user where id = 1;select * from user where id = 2;end;
如果没有改变MySQL客户端默认的解析语句结束符;,那么当写到select * from student where s_no = 1;,按下Enter回车键,那么它就会报错。
原因就在于它(MySQL客户端)把下面这段SQL当成一条完整的语句交给服务器执行了。
create procedure selectTwoSQL()beginselect * from user where id = 1;
如果暂时不按Enter键到了最后再按,其实它最终解析的顺序是一样的。
两个报错是因为它把写的存储过程看成三个语句来交给服务器执行了,而只有中间的语句select * from user where id = 2;是正确的SQL。
此时只需要改变一下结束分隔符:
当改变分隔符为??时,MySQL客户端会一直解析到符号??才认为这条语句结束了。
此时已经成功的创建了一个存储过程了。然后可以把分隔符重新改为默认的;,然后执行存储过程。
