• <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>

            牽著老婆滿街逛

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

            MySql中delimiter的作用是什么?

            轉(zhuǎn)載自:http://www.cnblogs.com/rootq/archive/2009/05/27/1490523.html

            這個(gè)命令與存儲(chǔ)過程沒什么關(guān)系吧。
            其實(shí)就是告訴mysql解釋器,該段命令是否已經(jīng)結(jié)束了,mysql是否可以執(zhí)行了。
            默認(rèn)情況下,delimiter是分號(hào);。在命令行客戶端中,如果有一行命令以分號(hào)結(jié)束,
            那么回車后,mysql將會(huì)執(zhí)行該命令。如輸入下面的語句
            mysql> select * from test_table;
            然后回車,那么MySQL將立即執(zhí)行該語句。

            但有時(shí)候,不希望MySQL這么做。在為可能輸入較多的語句,且語句中包含有分號(hào)。
            如試圖在命令行客戶端中輸入如下語句
            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;

            默認(rèn)情況下,不可能等到用戶把這些語句全部輸入完之后,再執(zhí)行整段語句。
            因?yàn)閙ysql一遇到分號(hào),它就要自動(dòng)執(zhí)行。
            即,在語句RETURN '';時(shí),mysql解釋器就要執(zhí)行了。
            這種情況下,就需要事先把delimiter換成其它符號(hào),如//或$$。
            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;//

            這樣只有當(dāng)//出現(xiàn)之后,mysql解釋器才會(huì)執(zhí)行這段語句

             

            例子:

            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 下運(yùn)行通過。

            編寫了個(gè)統(tǒng)計(jì)網(wǎng)站訪問情況(user agent)的 MySQL 存儲(chǔ)過程。就是下面的這段 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 這個(gè) MySQL 圖形客戶端下可以順利運(yùn)行。但是在 SQLyog MySQL GUI v5.02 這個(gè)客戶端就會(huì)出錯(cuò)。最后找到原因是沒有設(shè)置好 delimiter 的問題。默認(rèn)情況下,delimiter “;” 用于向 MySQL 提交查詢語句。在存儲(chǔ)過程中每個(gè) SQL 語句的結(jié)尾都有個(gè) “;”,如果這時(shí)候,每逢 “;” 就向 MySQL 提交的話,當(dāng)然會(huì)出問題了。于是更改 MySQL 的 delimiter,上面 MySQL 存儲(chǔ)過程就編程這樣子了:

            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 ; // -- 改回默認(rèn)的 MySQL delimiter:“;”
            

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

            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 ; // -- 改回默認(rèn)的 MySQL delimiter:“;”
            -> //
            -> //
            -> //
            -> ;
            -> ;
            ->
            

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

            mysql> delimiter // -- 末尾不要符號(hào) “;”
            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 ; -- 末尾不要符號(hào) “//”
            mysql>
            

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

            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) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产偷久久久精品专区| 久久久久免费看成人影片| 久久av高潮av无码av喷吹| 久久综合久久伊人| 伊人色综合久久天天人手人婷| 国产精品久久久久久一区二区三区| 久久国产免费观看精品| 久久这里只有精品视频99| 日韩精品久久无码中文字幕| 久久99国产精一区二区三区| 久久人人青草97香蕉| 久久青青草原综合伊人| 99精品国产综合久久久久五月天 | 亚洲国产日韩综合久久精品| 久久精品国产亚洲AV无码偷窥 | 热久久视久久精品18| 久久99国产综合精品免费| 久久亚洲av无码精品浪潮| 久久精品国产91久久综合麻豆自制 | 久久精品国产影库免费看 | 久久精品国产色蜜蜜麻豆| 一本大道久久a久久精品综合| 亚洲欧美伊人久久综合一区二区| 久久精品无码一区二区三区免费| 无码人妻久久一区二区三区免费| 久久人人爽人人爽AV片| 亚洲精品高清国产一久久| 久久久无码精品亚洲日韩按摩| 香蕉久久久久久狠狠色| 久久久久久国产a免费观看不卡| 免费观看久久精彩视频| 99久久无码一区人妻a黑| 亚洲AV无一区二区三区久久| 国内精品久久国产| 超级碰碰碰碰97久久久久| 亚洲欧美久久久久9999| 久久久国产亚洲精品| 久久午夜夜伦鲁鲁片免费无码影视 | 久久福利资源国产精品999| 久久久久亚洲AV无码专区桃色| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 |