• <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 楊粼波 閱讀(667) 評論(0)  編輯 收藏 引用

            中文字幕久久欲求不满| 久久99精品久久久久子伦| 99热热久久这里只有精品68| 精品久久国产一区二区三区香蕉| 久久国产高清一区二区三区| 久久这里的只有是精品23| 国产亚洲婷婷香蕉久久精品| 日本高清无卡码一区二区久久| 无码国内精品久久人妻蜜桃 | 欧美日韩精品久久免费| 亚洲综合熟女久久久30p| 伊人久久精品线影院| 欧美精品国产综合久久| 精品国产综合区久久久久久 | 97久久精品人人做人人爽| 午夜精品久久影院蜜桃| 久久综合久久综合久久综合| 久久亚洲AV无码精品色午夜| 国产2021久久精品| 九九久久自然熟的香蕉图片| 一级A毛片免费观看久久精品| 久久精品国内一区二区三区| 人妻无码中文久久久久专区| 亚洲人成无码www久久久| 国产日韩久久久精品影院首页| 色狠狠久久AV五月综合| 久久综合久久美利坚合众国| 久久午夜免费视频| 中文字幕久久亚洲一区| 丁香久久婷婷国产午夜视频| 99久久99这里只有免费费精品| 亚洲精品蜜桃久久久久久| 热久久最新网站获取| 亚洲日韩欧美一区久久久久我 | 久久频这里精品99香蕉久| 日产久久强奸免费的看| 久久精品亚洲福利| 伊人色综合久久天天网| 中文字幕精品无码久久久久久3D日动漫| 久久精品国产亚洲Aⅴ蜜臀色欲| 精品国产乱码久久久久久浪潮|