這個命令與存儲過程沒什么關系吧。
其實就是告訴mysql解釋器,該段命令是否已經結束了,mysql是否可以執行了。
默認情況下,delimiter是分號;。在命令行客戶端中,如果有一行命令以分號結束,
那么回車后,mysql將會執行該命令。如輸入下面的語句
mysql> select * from test_table;
然后回車,那么MySQL將立即執行該語句。
但有時候,不希望MySQL這么做。在為可能輸入較多的語句,且語句中包含有分號。
如試圖在命令行客戶端中輸入如下語句
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql> RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql> RETURN '';
mysql> ELSEIF N<15 THEN
mysql> RETURN LEFT(S, N);
mysql> ELSE
mysql> IF CHAR_LENGTH(S) <=N THEN
mysql> RETURN S;
mysql> ELSE
mysql> RETURN concat(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql> END IF;
mysql> END IF;
mysql> END;
默認情況下,不可能等到用戶把這些語句全部輸入完之后,再執行整段語句。
因為mysql一遇到分號,它就要自動執行。
即,在語句RETURN '';時,mysql解釋器就要執行了。
這種情況下,就需要事先把delimiter換成其它符號,如//或$$。
mysql> delimiter //
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql> RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql> RETURN '';
mysql> ELSEIF N<15 THEN
mysql> RETURN LEFT(S, N);
mysql> ELSE
mysql> IF CHAR_LENGTH(S) <=N THEN
mysql> RETURN S;
mysql> ELSE
mysql> RETURN concat(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql> END IF;
mysql> END IF;
mysql> END;//
這樣只有當//出現之后,mysql解釋器才會執行這段語句
例子:
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> select COUNT(*) INTO param1 FROM t;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
mysql> select @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
本文代碼在 MySQL 5.0.41-community-nt 下運行通過。
編寫了個統計網站訪問情況(user agent)的 MySQL 存儲過程。就是下面的這段 SQL 代碼。
dropprocedureifexistspr_stat_agent;--callpr_stat_agent('2008-07-17','2008-07-18')createprocedurepr_stat_agent(pi_date_fromdate,pi_date_todate)begin--checkinputif(pi_date_fromisnull)thensetpi_date_from=current_date();endif;if(pi_date_toisnull)thensetpi_date_to=pi_date_from;endif;setpi_date_to=date_add(pi_date_from,interval1day);--statselectagent,count(*)ascntfromapache_logwhererequest_time>=pi_date_fromandrequest_time<pi_date_togroupbyagentorderbycntdesc;end;
我在 EMS SQL Manager 2005 for MySQL 這個 MySQL 圖形客戶端下可以順利運行。但是在 SQLyog MySQL GUI v5.02 這個客戶端就會出錯。最后找到原因是沒有設置好 delimiter 的問題。默認情況下,delimiter “;” 用于向 MySQL 提交查詢語句。在存儲過程中每個 SQL 語句的結尾都有個 “;”,如果這時候,每逢 “;” 就向 MySQL 提交的話,當然會出問題了。于是更改 MySQL 的 delimiter,上面 MySQL 存儲過程就編程這樣子了:
delimiter//;--改變MySQLdelimiter為:“//”dropprocedureifexistspr_stat_agent//--callpr_stat_agent('2008-07-17','2008-07-18')createprocedurepr_stat_agent(pi_date_fromdate,pi_date_todate)begin--checkinputif(pi_date_fromisnull)thensetpi_date_from=current_date();endif;if(pi_date_toisnull)thensetpi_date_to=pi_date_from;endif;setpi_date_to=date_add(pi_date_from,interval1day);--statselectagent,count(*)ascntfromapache_logwhererequest_time>=pi_date_fromandrequest_time<pi_date_togroupbyagentorderbycntdesc;end;//delimiter;//--改回默認的MySQLdelimiter:“;”
當然,MySQL delimiter 符號是可以自由設定的,你可以用 “/” 或者“$$” 等。但是 MySQL 存儲過程中比較常見的用法是 “//” 和 “$$”。上面的這段在 SQLyog 中的代碼搬到 MySQL 命令客戶端(MySQL Command Line Client)卻不能執行。
mysql>delimiter//;--改變MySQLdelimiter為:“//”mysql>mysql>dropprocedureifexistspr_stat_agent//->->--callpr_stat_agent('2008-07-17','2008-07-18')->->createprocedurepr_stat_agent->(->pi_date_fromdate->,pi_date_todate->)->begin->--checkinput->if(pi_date_fromisnull)then->setpi_date_from=current_date();->endif;->->if(pi_date_toisnull)then->setpi_date_to=pi_date_from;->endif;->->setpi_date_to=date_add(pi_date_from,interval1day);->->--stat->selectagent,count(*)ascnt->fromapache_log->whererequest_time>=pi_date_from->andrequest_time<pi_date_to->groupbyagent->orderbycntdesc;->end;//->->delimiter;//--改回默認的MySQLdelimiter:“;”->//->//->//->;->;->
真是奇怪了!最后終于發現問題了,在 MySQL 命令行下運行 “delimiter //; ” 則 MySQL 的 delimiter 實際上是 “//;”,而不是我們所預想的 “//”。其實只要運行指令 “delimiter //” 就 OK 了。
mysql>delimiter//--末尾不要符號“;”mysql>mysql>dropprocedureifexistspr_stat_agent//QueryOK,0rowsaffected(0.00sec)mysql>mysql>--callpr_stat_agent('2008-07-17','2008-07-18')mysql>mysql>createprocedurepr_stat_agent->(->pi_date_fromdate->,pi_date_todate->)->begin->--checkinput->if(pi_date_fromisnull)then->setpi_date_from=current_date();->endif;->->if(pi_date_toisnull)then->setpi_date_to=pi_date_from;->endif;->->setpi_date_to=date_add(pi_date_from,interval1day);->->--stat->selectagent,count(*)ascnt->fromapache_log->whererequest_time>=pi_date_from->andrequest_time<pi_date_to->groupbyagent->orderbycntdesc;->end;//QueryOK,0rowsaffected(0.00sec)mysql>mysql>delimiter;--末尾不要符號“//”mysql>
順帶一提的是,我們可以在 MySQL 數據庫中執行在文件中的 SQL 代碼。例如,我把上面存儲過程的代碼放在文件 d:\pr_stat_agent.sql 中??梢赃\行下面的代碼建立存儲過程。
mysql>sourced:\pr_stat_agent.sqlQueryOK,0rowsaffected(0.00sec)QueryOK,0rowsaffected(0.00sec)
source 指令的縮寫形式是:“\.”
mysql>\.d:\pr_stat_agent.sqlQueryOK,0rowsaffected(0.00sec)QueryOK,0rowsaffected(0.00sec)
最后,可見 MySQL 的客戶端工具在有些地方是各自為政,各有各的一套。
到此,關于“MySQL中的delimiter有什么作用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注本站網站,小編會繼續努力為大家帶來更多實用的文章!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
戴維斯雙殺是什么意思?戴維斯雙殺效應是由著名的投資人戴維斯提出的一種雙殺效應,指的是關于上市公司股票價格的波動和市場的預期之間的倍數效應。通俗來講就是股票的每股收益下滑引起了股價下滑,而股價下滑又會帶動市盈率下跌,PE下跌又會進一步導致股價下跌,簡單總結就是盈利和估值的雙雙下跌而導致的股價暴跌。戴維斯雙擊一般漲多少?上漲4.5倍。1、戴維斯雙擊是指在低市盈率(PE)買入股票,待成長潛力顯現后,以高...
創業板上市流程及條件有哪些(一)創業板上市流程1、企業股份改制;2、董事會討論股票發行的具體,提請股東大會批準內;3、股東大會通過上市決議容:股票的種類和數量;發行對象;價格區間、定價方式;募集資金用途;發行前滾存利潤的分配方案;決議的有效期;對董事會的授權;4、擬上市公司撰寫上市申請書;5、報請證券會;6、保薦人對擬上市公司的成長性進行盡職調查、審慎判斷并出具專項意見;自主創新企業說明發行人的自...
股票面值為什么是1元?股票面值是1元是為了節約發行成本和規范市場,方便股票交易的清算和過戶登記,所以監管機構統一規定股票面值設為1元。股票面值與股票市值有哪些區別?股票面值是股份公司發行的股票面值上標明的金額,這個金額就是面值。股票的面值通常是每股,上市發行公司將其資本分成若干股。每股代表的資本是每股的面值。股票的面值是固定不變的。也有一些股票沒有面值。股票面值的作用之一是確定每股股份對股份公司的...