Mysql应用MySql delimiter的作用是什么

Mysql应用MySql delimiter的作用是什么,第1张

概述介绍《Mysql应用MySql delimiter的作用是什么》开发教程,希望对您有用。

《MysqL应用MysqL delimiter的作用是什么》要点:
本文介绍了MysqL应用MysqL delimiter的作用是什么,希望对您有用。如果有疑问,可以联系我们。

MysqL导出一个sql后:
DEliMITER $$
DROP TRIGGER IF EXISTS `updateegopriceondelete`$$
CREATE
    TRIGGER `updateegopriceondelete` AFTER  DELETE ON  `customerinfo`
    FOR EACH ROW BEGIN
DELETE FROM egoprice  WHERE customerID=olD.customerID;
    END$$
DEliMITER ;

其中DEliMITER 定好结束符为"$$",然后最后又定义为";",MysqL的默认结束符为";".



详细解释:

其实就是告诉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),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',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
    ->  ,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)

最后,可见 MysqL 的客户端工具在有些地方是各自为政,各有各的一套. 总结

以上是内存溢出为你收集整理的Mysql应用MySql delimiter的作用是什么全部内容,希望文章能够帮你解决Mysql应用MySql delimiter的作用是什么所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存