前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【问答】MySQL存储过程中的 ?? 和 // 是什么?

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

作者头像
用户1260737
发布2021-03-05 14:37:08
2.3K0
发布2021-03-05 14:37:08
举报
文章被收录于专栏:趣谈编程趣谈编程

在平时工作中,有时我们会编写存储过程。在存储过程中我们会在网上看到一些例子,在例子中会有类似 DELIMITER ?? 或者 DELIMITER // 这种写法,这种写法看上去就比较迷惑,并且网上的介绍也模棱两可。今天我就带你了解一下这个用法的含义。

其实含义很简单,就是使用DELIMITER关键字告诉MySQL客户端,你判断一条SQL语句是否终止时不要以默认的分隔符;来解析了。用关键字DELIMITER 后面的那个符号来解析,比如??

我们在MySQL客户端写完SQL时会以分隔符;来作为一条完整的SQL语句的终止符,比如:

但是在存储过程中我们会在一个存储过程内写很多以;结束的语句,设置变量,循环,具体的多个SQL语句等都会以;结束,那么就会出现MySQL客户端解析到第一个;就认为你写的这个语句已经写完了,它就发送这条语句给服务端执行这个SQL了。显然你还没有写完,此时解析就会报错。

比如你想写一个包含两个查询SQL语句的存储过程。

代码语言:javascript
复制
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当成一条完整的语句交给服务器执行了。

代码语言:javascript
复制
create procedure selectTwoSQL()
begin
select * from student where s_no = 1;

这个肯定报错呀。有人说我可以暂时不按Enter键到了最后再按,其实它最终解析的顺序是一样的。

这次两个报错,是因为它把你写的存储过程看成三个语句来交给服务器执行了,而只有中间的语句select * from teacher where id = 1;是正确的SQL。

此时你只需要改变一下结束分隔符:

当你改变分隔符为??时,MySQL客户端会一直解析到符号??才认为你这条语句结束了。

此时你已经成功的创建了一个存储过程了。然后你可以把分隔符重新改为默认的;,然后执行存储过程。

PS: 问答栏目专注于程序员平时遇到的大大小小的问题,偏实战,如果你平时有遇到什么问题,或者你乐于帮助别人解答问题。欢迎加我微信(QuTanBianCheng_Tao)拉你进问答社区群,加我时备注问答社区。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣谈编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档