以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获。

下面是一个存储过程的实例:DELIMITER $$

USE `xht_ywp`$$

DROP PROCEDURE IF EXISTS `batchGetNsjgTreeList`$$

CREATE DEFINER=`dlwy`@`%` PROCEDURE `batchGetNsjgTreeList`(dwCode VARCHAR(20),rootId VARCHAR(1000),isParent INT, haveSelf INT)

BEGIN

# isParent0:查询子节点 1:查询父节点 2:返回经过节点的父节点以及子节点。

#haveSelf0: 不包含自身 1:包含自身a

DECLARE nsjgIds_all TEXT;

DECLAREtableName VARCHAR(100);

DECLAREfieldName VARCHAR(100);

DECLAREwhereFieldName VARCHAR(100);

# 记录所有的ID。

SET nsjgIds_all = IF(haveSelf=1,CAST(rootId AS CHAR),"");

loop_start : LOOP

SET fieldName = IF(isParent=0,'NSJGID','PARID');

SET tableName = CONCAT("XH_NSJG_TB",IF(LENGTH(dwCode)>0,"_",""),dwCode);

SET whereFieldName = IF(isParent>0,'NSJGID','PARID');

SET @nsjgIds = CAST(rootId AS CHAR);

SET @curSql = CONCAT("SELECT GROUP_CONCAT(",fieldName,") INTO @nsjgIds FROM ",tableName," WHERE FIND_IN_SET (",whereFieldName,",?)");

# 循环查询所有节点

WHILE LENGTH(@nsjgIds) > 0 DO

PREPARE stmt FROM @curSql;

EXECUTE stmt USING @nsjgIds;

DEALLOCATE PREPARE stmt;

IF @nsjgIds IS NOT NULL THEN

SET nsjgIds_all = CONCAT(nsjgIds_all,IF(LENGTH(nsjgIds_all),",",""),@nsjgIds);

END IF;

END WHILE;

SET isParent = isParent - 2;

IF isParent

LEAVE loop_start;

END IF;

END LOOP;

SET @curSql = CONCAT("SELECT * FROM ",tableName," WHERE NSJGID IN (",nsjgIds_all,")");

PREPARE stmt FROM @curSql;

EXECUTE stmt ;

DEALLOCATE PREPARE stmt;

END$$

DELIMITER ;

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

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

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

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

-> 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数据库的客户端工具在有些地方是各自为政,各有各的一套。

mysql leave的作用_MySQL数据库中DELIMITER的作用相关推荐

  1. mysql delimiter的作用_MySQL数据库中delimiter的作用概述

    以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获. 其实就是告 ...

  2. mysql gps数据查询_Mysql数据库中计算两GPS坐标的距离

    Mysql数据库中计算两GPS坐标的距离有两种方式: 1.直接使用SQL语句:#lat为纬度, lng为经度, 一定不要弄错 declare @lng1 float; declare @lat1 fl ...

  3. mysql 查找字符位置_MySQL数据库中如何查看一个字符串在另一个字符串中第一次出现的位置呢?...

    摘要: 下文讲述MySQL数据库中查看一个字符串第一次出现的位置的方法分享,如下所示: 实现思路: 方式1: 使用系统函数LOCATE(substr,str)即可获取 substr字符串在str中第一 ...

  4. mysql查询低效语句_MySQL数据库中查找执行从命慢的SQL语句

    MySQL数据库中查找执行从命慢的SQL语句 (2011-09-15 08:21:35) 标签: 杂谈 去历:赛迪网 做者:Alizze 启动Mysql时减参数--log-slow-queries去挤 ...

  5. mysql 修改结束符_MySQL数据库中DELIMITER修改结束符教程及应用实例

    关于DELIMITER 在MySQL中默认的结束符DELIMITER是;,它用于标识一段命令是否结束.在默认情况下,在命令行客户端中,如果有一行命令以;结束,那么回车后,MySQL将会执行该命令. 修 ...

  6. mysql数据库中count的作用_MySQL数据库中的count的用法

    1.概念 在开发系统的时候,可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数.这时候你可能会想,一条select count(*) from t 语句不就解决了吗? 但是,会发现随着系 ...

  7. mysql引擎 实际应用_MySQL数据库中的三个引擎

    以下的文章主要介绍的是对MySQL数据库支持的3个实际应用引擎的巧妙接触,如果你对MySQL数据库支持的3个实际应用引擎的实际应用很感兴趣的话,你就可以浏览以下的文章了,望你会有所收获. ISAM是一 ...

  8. Mysql游标循环遍历_MySQL数据库中,使用游标循环遍历

    /* 对*dt库下的所有数据表删除docuemttype为空和documenttype为MD,PD,ET的数据: delete from 表名 where length(documenttype)&l ...

  9. mysql的timestamp类型_MySQL数据库中的timestamp类型与时区

    MySQL的timestamp类型时间范围between '1970-01-01 00:00:01' and '2038-01-19 03:14:07',超出这个范围则值记录为'0000-00-00  ...

最新文章

  1. html 屏蔽蓝色电话,html – 在Chrome扩展程序中停用文字字段蓝色突出显示?
  2. java竞拍系统代码,网上拍卖系统的设计与实现(源代码及全套资料).doc
  3. python3 获取当前路径_python3获取当前目录(转)
  4. JSP、EL和JSTL-学习笔记03【EL介绍和运算符、EL获取域中存储的数据】
  5. Python 多种算法模型对比
  6. 程序员的自我进化:终于明白试图依靠跳槽和转行解决自身问题的,只会越来越差
  7. 【渝粤教育】国家开放大学2018年春季 0177-21T电机学(二) 参考试题
  8. bsc是指什么_为什么KPI令人厌恶?中小企业不要乱用KPI!
  9. PhoneGap开发环境搭建
  10. ZOJ 3987 2017CCPC秦皇岛 G:Numbers(高精度+贪心)
  11. 众包专访:告别接包黑历史,来到开源中国众包接包小记
  12. php 去除零宽度空格,如何在PHP变量中去除空格?
  13. TTL和CMOS解析
  14. MD5算法实战JS解密
  15. 谷歌地图api根据经纬度查询地名php,在线查询经纬度 google map查询地名返回经纬度 geocode geocoder的完整实例 代码下载...
  16. 小米tts语音引擎下载_在手机和 AIoT 双战场打拼的小爱同学,会把语音助手带向何方?...
  17. ASPNET 5 和 dnx commands
  18. Mac SCP简单使用(Mac WinSCP)
  19. 程序员须知!IT界含金量高的认证考试有哪些?
  20. c语言string 用法,C++中的String的常用函数用法总结

热门文章

  1. 关于HbSrv.exe
  2. jni c java互相调用_通过JNI实现Java和C++的相互调用
  3. Mac安装brew及报错处理办法
  4. javaScript数据类型(包括基本数据类型和非基本数据类型)
  5. 不同文件类型输出及ContentType表
  6. linux6.8安装图形桌面,图形/文本界面安装CentOS 6.8系统详解
  7. linux基于域的虚拟目录,RHELAS4.0 apache配置之我的小结(虚拟目录,虚拟主机)
  8. 线程,进程,并发,并行
  9. 【离散数学中的数据结构与算法】四 加法法则与乘法法则
  10. ansible的错误