• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            MySql中delimiter的作用是什么?

            轉載自:http://www.cnblogs.com/rootq/archive/2009/05/27/1490523.html

            這個命令與存儲過程沒什么關系吧。
            其實就是告訴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 代碼。

            drop procedure if exists pr_stat_agent;
            -- call pr_stat_agent ('2008-07-17', '2008-07-18')
            create procedure pr_stat_agent
            (
            pi_date_from date
            ,pi_date_to date
            )
            begin
            -- check input
            if (pi_date_from is null) then
            set pi_date_from = current_date();
            end if;
            if (pi_date_to is null) then
            set pi_date_to = pi_date_from;
            end if;
            set pi_date_to = date_add(pi_date_from, interval 1 day);
            -- stat
            select agent, count(*) as cnt
            from apache_log
            where request_time >= pi_date_from
            and request_time < pi_date_to
            group by agent
            order by cnt desc;
            end;
            

            我在 EMS SQL Manager 2005 for MySQL 這個 MySQL 圖形客戶端下可以順利運行。但是在 SQLyog MySQL GUI v5.02 這個客戶端就會出錯。最后找到原因是沒有設置好 delimiter 的問題。默認情況下,delimiter “;” 用于向 MySQL 提交查詢語句。在存儲過程中每個 SQL 語句的結尾都有個 “;”,如果這時候,每逢 “;” 就向 MySQL 提交的話,當然會出問題了。于是更改 MySQL 的 delimiter,上面 MySQL 存儲過程就編程這樣子了:

            delimiter //; -- 改變 MySQL delimiter 為:“//”
            drop procedure if exists pr_stat_agent //
            -- call pr_stat_agent ('2008-07-17', '2008-07-18')
            create procedure pr_stat_agent
            (
            pi_date_from date
            ,pi_date_to date
            )
            begin
            -- check input
            if (pi_date_from is null) then
            set pi_date_from = current_date();
            end if;
            if (pi_date_to is null) then
            set pi_date_to = pi_date_from;
            end if;
            set pi_date_to = date_add(pi_date_from, interval 1 day);
            -- stat
            select agent, count(*) as cnt
            from apache_log
            where request_time >= pi_date_from
            and request_time < pi_date_to
            group by agent
            order by cnt desc;
            end; //
            delimiter ; // -- 改回默認的 MySQL delimiter:“;”
            

            當然,MySQL delimiter 符號是可以自由設定的,你可以用 “/” 或者“$$” 等。但是 MySQL 存儲過程中比較常見的用法是 “//” 和 “$$”。上面的這段在 SQLyog 中的代碼搬到 MySQL 命令客戶端(MySQL Command Line Client)卻不能執行。

            mysql> delimiter //; -- 改變 MySQL delimiter 為:“//”
            mysql>
            mysql> drop procedure if exists pr_stat_agent //
            ->
            -> -- call pr_stat_agent ('2008-07-17', '2008-07-18')
            ->
            -> create procedure pr_stat_agent
            -> (
            -> pi_date_from date
            -> ,pi_date_to date
            -> )
            -> begin
            -> -- check input
            -> if (pi_date_from is null) then
            -> set pi_date_from = current_date();
            -> end if;
            ->
            -> if (pi_date_to is null) then
            -> set pi_date_to = pi_date_from;
            -> end if;
            ->
            -> set pi_date_to = date_add(pi_date_from, interval 1 day);
            ->
            -> -- stat
            -> select agent, count(*) as cnt
            -> from apache_log
            -> where request_time >= pi_date_from
            -> and request_time < pi_date_to
            -> group by agent
            -> order by cnt desc;
            -> end; //
            ->
            -> delimiter ; // -- 改回默認的 MySQL delimiter:“;”
            -> //
            -> //
            -> //
            -> ;
            -> ;
            ->
            

            真是奇怪了!最后終于發現問題了,在 MySQL 命令行下運行 “delimiter //; ” 則 MySQL 的 delimiter 實際上是 “//;”,而不是我們所預想的 “//”。其實只要運行指令 “delimiter //” 就 OK 了。

            mysql> delimiter // -- 末尾不要符號 “;”
            mysql>
            mysql> drop procedure if exists pr_stat_agent //
            Query OK, 0 rows affected (0.00 sec)
            mysql>
            mysql> -- call pr_stat_agent ('2008-07-17', '2008-07-18')
            mysql>
            mysql> create procedure pr_stat_agent
            -> (
            -> pi_date_from date
            -> ,pi_date_to date
            -> )
            -> begin
            -> -- check input
            -> if (pi_date_from is null) then
            -> set pi_date_from = current_date();
            -> end if;
            ->
            -> if (pi_date_to is null) then
            -> set pi_date_to = pi_date_from;
            -> end if;
            ->
            -> set pi_date_to = date_add(pi_date_from, interval 1 day);
            ->
            -> -- stat
            -> select agent, count(*) as cnt
            -> from apache_log
            -> where request_time >= pi_date_from
            -> and request_time < pi_date_to
            -> group by agent
            -> order by cnt desc;
            -> end; //
            Query OK, 0 rows affected (0.00 sec)
            mysql>
            mysql> delimiter ; -- 末尾不要符號 “//”
            mysql>
            

            順帶一提的是,我們可以在 MySQL 數據庫中執行在文件中的 SQL 代碼。例如,我把上面存儲過程的代碼放在文件 d:\pr_stat_agent.sql 中。可以運行下面的代碼建立存儲過程。

            mysql> source d:\pr_stat_agent.sql
            Query OK, 0 rows affected (0.00 sec)
            Query OK, 0 rows affected (0.00 sec)
            

            source 指令的縮寫形式是:“\.”

            mysql> \. d:\pr_stat_agent.sql
            Query OK, 0 rows affected (0.00 sec)
            Query OK, 0 rows affected (0.00 sec)
            

            最后,可見 MySQL 的客戶端工具在有些地方是各自為政,各有各的一套。

            posted on 2014-06-13 11:51 楊粼波 閱讀(668) 評論(0)  編輯 收藏 引用

            欧美国产成人久久精品| 久久男人Av资源网站无码软件| 精品久久久久中文字幕日本| 一本大道久久a久久精品综合| 一本综合久久国产二区| 丁香五月综合久久激情| 久久久女人与动物群交毛片| 99国产精品久久久久久久成人热| 久久国产亚洲精品| 国产精品gz久久久| 久久国产精品99国产精| 亚洲国产精品狼友中文久久久| 久久久久人妻精品一区二区三区 | 国产情侣久久久久aⅴ免费| 亚洲天堂久久精品| 久久综合88熟人妻| 亚洲色大成网站WWW久久九九| 久久国产香蕉一区精品| 久久国产精品免费| 国产综合成人久久大片91| 蜜臀av性久久久久蜜臀aⅴ| 午夜精品久久久内射近拍高清| 久久久久亚洲AV综合波多野结衣| 久久精品国产亚洲精品2020| 中文字幕久久精品无码| 亚洲欧洲久久av| 麻豆久久| 人妻精品久久久久中文字幕| 久久久久国产视频电影| 伊人久久精品线影院| 好久久免费视频高清| 久久久久久久综合日本亚洲 | 久久综合九色欧美综合狠狠| 久久91精品国产91久久小草| 无码国产69精品久久久久网站| av午夜福利一片免费看久久| 久久精品一区二区三区AV| 成人国内精品久久久久一区| 亚洲AV乱码久久精品蜜桃| 久久精品国产久精国产一老狼| 狠狠色婷婷久久综合频道日韩|