【问答】MySQL存储过程中的 ?? 和 // 是什么?
在平时工作中,有时我们会编写存储过程。在存储过程中我们会在网上看到一些例子,在例子中会有类似 DELIMITER ?? 或者 DELIMITER // 这种写法,这种写法看上去就比较迷惑,并且网上的介绍也模棱两可。今天我就带你了解一下这个用法的含义。
其实含义很简单,就是使用DELIMITER
关键字告诉MySQL客户端,你判断一条SQL语句是否终止时不要以默认的分隔符;
来解析了。用关键字DELIMITER
后面的那个符号来解析,比如??
。
我们在MySQL客户端写完SQL时会以分隔符;
来作为一条完整的SQL语句的终止符,比如:
但是在存储过程中我们会在一个存储过程内写很多以;
结束的语句,设置变量,循环,具体的多个SQL语句等都会以;
结束,那么就会出现MySQL客户端解析到第一个;
就认为你写的这个语句已经写完了,它就发送这条语句给服务端执行这个SQL了。显然你还没有写完,此时解析就会报错。
比如你想写一个包含两个查询SQL语句的存储过程。
create procedure selectTwoSQL()
begin
select * from student where s_no = 1;
select * from teacher where id = 1;
end;
如果你没有改变MySQL客户端默认的解析语句结束符;
,那么当你写到select * from student where s_no = 1;
,按下Enter
回车键,那么它就会报错。
原因就在于它(MySQL客户端)把下面这段SQL当成一条完整的语句交给服务器执行了。
create procedure selectTwoSQL()
begin
select * from student where s_no = 1;
这个肯定报错呀。有人说我可以暂时不按Enter
键到了最后再按,其实它最终解析的顺序是一样的。
这次两个报错,是因为它把你写的存储过程看成三个语句来交给服务器执行了,而只有中间的语句select * from teacher where id = 1;
是正确的SQL。
此时你只需要改变一下结束分隔符:
当你改变分隔符为??
时,MySQL客户端会一直解析到符号??
才认为你这条语句结束了。
此时你已经成功的创建了一个存储过程了。然后你可以把分隔符重新改为默认的;
,然后执行存储过程。
PS: 问答栏目专注于程序员平时遇到的大大小小的问题,偏实战,如果你平时有遇到什么问题,或者你乐于帮助别人解答问题。欢迎加我微信(QuTanBianCheng_Tao)拉你进问答社区群,加我时备注问答社区。
趣谈编程
让天下没有
难懂的技术