mysql leave的作用_MySQL数据库中DELIMITER的作用

以下的文章主要是向大家描述的是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数据库的客户端工具在有些地方是各自为政,各有各的一套。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fullpage参数说明

参数说明 $(document).ready(function() {$(#fullpage).fullpage({//Navigationmenu: false,//绑定菜单&#xff0c;设定的相关属性与anchors的值对应后&#xff0c;菜单可以控制滚动&#xff0c;默认为false。anchors:[firstPage, secondPage],//anchors定义锚链接&#xff0c…

mysql100个优化技巧_完整篇:100+个MySQL调试和优化技巧(2)

▼MySQL模式优化51.检查和经常优化表.52. 经常重写InnoDB表优化.53. 有时&#xff0c;当添加列时删除索引&#xff0c;然后在添加回来索引&#xff0c;这样就会更快.54. 针对不同的需求&#xff0c;使用不同的存储引擎.55. 使用归档存储引擎日志表或审计表-这是更有效地写道.56…

Java Swing

编辑中... 转载于:https://www.cnblogs.com/startup-try/p/8040625.html

包装类java_Java 包装类

也叫过滤流类处理刘类没有对应到任何具体的流设备&#xff0c;需要给它传递一个对应的具体流设备的输出/输入流对象I/0内存缓冲BufferedInputStream,BufferedOutputStream 缓冲区包装类 默认32个字节缓冲区的缓冲流内存/磁盘扇区一次读写操作所能完成最大字节数的整数倍(4的整数…

简单的SQL注入学习

引贴&#xff1a; http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面&#xff0c;讲php页面放入/opt/lampp/htdocs目录下&#xff1a; 解释一下这个页面&#xff1a; 1.通过if语句判断变量是否初始化 2.if语句中通过mysql_conne…

vb红绿灯自动切换_VB红绿灯程序

《VB红绿灯程序》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《VB红绿灯程序(4页珍藏版)》请在人人文库网上搜索。1、VB红绿灯演示Private Sub Command1_Click()While (1)Shape1.FillColor RGB(255, 0, 0)Shape2.FillColor RGB(0, 0, 0)Shape3.FillColor RGB(0, …

什么是网站监控?

网站监控是跟踪网站的可用性和性能&#xff0c;以最小化宕机时间&#xff0c;优化性能并确保顺畅的用户体验。维护网站正常运行对于任何企业来说都是至关重要的&#xff0c;因而对大多数业务来说&#xff0c;网站应用监控都是一个严峻的挑战。Applications Manager网站应用监控…

循序渐进PYTHON3(十三) --4-- DJANGO之CSRF使用

用 django 有多久&#xff0c;跟 csrf 这个概念打交道就有久。 每次初始化一个项目时都能看到 django.middleware.csrf.CsrfViewMiddleware 这个中间件每次在模板里写 form 时都知道要加一个 {% csrf_token %} tag每次发 ajax POST 请求&#xff0c;都需要加一个 X_CSRFTOKEN 的…

java string replace 重载_关于Java:如何使用replace(char,char)替换字符b的所有实例为空...

如何使用replace(char&#xff0c;char)将字符" b"的所有实例全部替换为空。例如&#xff1a;Hambbburger to Hamurger编辑&#xff1a;有一个约束&#xff0c;我只能使用1.4.2&#xff0c;这意味着没有重载版本的replace&#xff01;你不能因为什么都不是字符&#…

JavaScript——执行环境、变量对象、作用域链

前言 这几天在看《javascript高级程序设计》&#xff0c;看到执行环境和作用域链的时候&#xff0c;就有些模糊了。书中还是讲的不够具体。通过上网查资料&#xff0c;特来总结&#xff0c;以备回顾和修正。 目录&#xff1a; EC(执行环境或者执行上下文&#xff0c;Execution …

java线程interrupt用法_Java 如何中断线程

本篇文章帮大家学习java 如何中断线程&#xff0c;包含了Java 如何中断线程使用方法、操作技巧、实例演示和注意事项&#xff0c;有一定的学习价值&#xff0c;大家可以用来参考。以下实例演示了如何使用interrupt()方法来中断线程并使用 isInterrupted() 方法来判断线程是否已…

laravel5.4之artisan使用总结一

Artisan是laravel自带的命令行接口&#xff1a; php artisan list 编写命令 生成命令&#xff1a; 可以使用Artisan命令&#xff0c;php artisan make:command ConsoleTest 执行完这个命令后&#xff0c;会在app/Console/Commands 目录下创建ConsoleTest命令类。会包含默认的属…

java如何保证类不被回收_垃圾回收机制保证了Java程序不会出现内存溢出。( )

【简答题】1.激素(名词解释)【单选题】6.下列哪种情况下可引起ADH分泌增加【判断题】在Java中使用String类型的实例对象表示一个字符串。( )【判断题】static关键字可以修饰成员变量,也可以修饰局部变量。( )【单选题】建设项目投资控制应贯穿于建设工程全过程,在建设项目实施阶…

intellij idea 分屏设置 与快捷键

1、找到分屏功能 File -> setting -> keymap&#xff0c;搜索&#xff08;注意大小写&#xff09;&#xff1a;   Split Vertically 水平分屏   Split Horizontally 垂直分屏 2、设置快捷键&#xff0c; 编辑快捷键的地方在搜索框同一行&#xff1a;    在标签上直…

java parseexception_Java ParseException类代码示例

import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException; //导入依赖的package包/类Overridepublic void read(File file) throws IOException {try {Document doc db.parse(file);NodeList nlTimeSlots (NodeList) xp.evaluate("/ANNOTATION_DOCU…

bzoj 4016: [FJOI2014]最短路径树问题

Description 给一个包含n个点&#xff0c;m条边的无向连通图。从顶点1出发&#xff0c;往其余所有点分别走一次并返回。 往某一个点走时&#xff0c;选择总长度最短的路径走。若有多条长度最短的路径&#xff0c;则选择经过的顶点序列字典序最小的那条路径(如路径A为1,32,11&am…

java.nio.file 找不到_java - 断言该错误:无法访问路径(找不到java.nio.file.Path) - 堆栈内存溢出...

我想使用Robolectric进行单元测试&#xff0c;但是我正在尝试使用robolectric进行简单测试&#xff0c;因此一开始我很困惑。 我遵循了手册&#xff0c;对示例进行了同样的操作&#xff0c;甚至其他帖子也无济于事。 每次收到错误消息&#xff1a;无法访问路径。 找不到java.ni…

SSH整合方案二(不带hibernate.cfg.xml)

整体结构: 1.引入相关jar包 2.编写实体类和映射文件 package cn.zqr.domain;public class Customer {private Long cust_id;private String cust_name;private Long cust_user_id;private Long cust_create_id;private String cust_source;private String cust_industry;privat…

java铃声类_MediaPlayer.setDataSource中的java.lang.IllegalStateException,使用铃声类

我有一个用户(Samsung Galaxy S5&#xff0c;Android 4.4)报告的崩溃&#xff0c;我不明白发生了什么。这似乎是可以吸收的&#xff0c;但也许有些人遇到了同样的问题&#xff0c;或类似的问题。MediaPlayer.setDataSource中的java.lang.IllegalStateException&#xff0c;使用…

POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )

题意 : 有 n 种面额的硬币&#xff0c;给出各种面额硬币的数量和和面额数&#xff0c;求最多能搭配出几种不超过 m 的金额&#xff1f; 分析 : 这题可用多重背包来解&#xff0c;但这里不讨论这种做法。 如果之前有接触过背包DP的可以自然想到DP数组的定义 > dp[i][j] 表示…