【問答】MySQL存儲過程中的 ?? 和 // 是什么?
在平時工作中,有時我們會編寫存儲過程。在存儲過程中我們會在網上看到一些例子,在例子中會有類似 DELIMITER ???或者 DELIMITER //?這種寫法,這種寫法看上去就比較迷惑,并且網上的介紹也模棱兩可。今天我就帶你了解一下這個用法的含義。
其實含義很簡單,就是使用DELIMITER關鍵字告訴MySQL客戶端,你判斷一條SQL語句是否終止時不要以默認的分隔符;來解析了。用關鍵字DELIMITER 后面的那個符號來解析,比如??。
我們在MySQL客戶端寫完SQL時會以分隔符;來作為一條完整的SQL語句的終止符,比如:

但是在存儲過程中我們會在一個存儲過程內寫很多以;結束的語句,設置變量,循環(huán),具體的多個SQL語句等都會以;結束,那么就會出現(xiàn)MySQL客戶端解析到第一個;就認為你寫的這個語句已經寫完了,它就發(fā)送這條語句給服務端執(zhí)行這個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當成一條完整的語句交給服務器執(zhí)行了。
create?procedure?selectTwoSQL()
begin
select?*?from?student?where?s_no?=?1;
這個肯定報錯呀。有人說我可以暫時不按Enter鍵到了最后再按,其實它最終解析的順序是一樣的。

這次兩個報錯,是因為它把你寫的存儲過程看成三個語句來交給服務器執(zhí)行了,而只有中間的語句select * from teacher where id = 1;是正確的SQL。
此時你只需要改變一下結束分隔符:

當你改變分隔符為??時,MySQL客戶端會一直解析到符號??才認為你這條語句結束了。
此時你已經成功的創(chuàng)建了一個存儲過程了。然后你可以把分隔符重新改為默認的;,然后執(zhí)行存儲過程。

PS: 問答欄目專注于程序員平時遇到的大大小小的問題,偏實戰(zhàn),如果你平時有遇到什么問題,或者你樂于幫助別人解答問題。歡迎加我微信(QuTanBianCheng_Tao)拉你進問答社區(qū)群,加我時備注問答社區(qū)。

趣談編程
讓天下沒有
難懂的技術
