【问答】MySQL存储过程中的 ?? 和 // 是什么?

趣谈编程

共 1214字,需浏览 3分钟

 ·

2021-02-09 14:31

在平时工作中,有时我们会编写存储过程。在存储过程中我们会在网上看到一些例子,在例子中会有类似 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)拉你进问答社区群,加我时备注问答社区




趣谈编程

让天下没有

难懂的技术

浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报