`

mysql DELIMITER

阅读更多
以下的文章主要是向大家描述的是MySQL数据库中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 < pi_date_to
group by agent 
order by cnt desc; 
end; 
分享到:
评论

相关推荐

    详解 Mysql中的delimiter定义及作用

    初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程、触发器、函数等。 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其解。 其实就是告诉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 ...

    MySql中 delimiter 详解.docx

    在MySQL中,`delimiter`命令是用来设定SQL语句的结束符的,它的主要作用是告诉MySQL解释器何时一个完整的命令结束,从而可以开始执行。在默认情况下,MySQL使用分号(;)作为命令的终止符。这意味着当你在MySQL...

    csharp mysql客户端类

    为解决在使用官方客户端类执行mysql脚本时,仅用Execute方法,不支持返回数据结果集的问题, 参照官方MySql.Data.dll中的源码写了一个扩展类,可以执行 MySQL Workbench中可执行的任何脚本,并返回select结果集到一...

    MySQL入门+进阶资源合集.pdf

    ### MySQL入门+进阶资源合集 #### 一、MySQL基础知识与入门 ##### 1.1 MySQL基础概念 - **数据库(Database)**:是用于存储数据的逻辑容器,它能够高效地管理和组织数据。 - **表(Table)**:是数据库中用来存储...

    MySQL基础PDF版

    - **语句结束符**:一般使用分号,但在某些情况下可以使用`\G`或`\g`,`DELIMITER`命令可以修改语句结束符。 - **SQL的大小写不敏感**:但为了代码的可读性,通常将数据库对象名称和关键字大写,用户定义的标识符...

    mysql与oracle差异总结

    MySql 使用 DELIMITER 语句来标记函数的开始和结束,而 Oracle 使用 CREATE FUNCTION 语句。在 MySql 中,同时还需要指定函数的定义者和字符集。 2. 变量声明 在 MySql 中,所有的声明必须在函数体之前,全局变量...

    mysql 基本命令,及java中访问mysql

    MySQL是世界上最流行的开源关系型数据库管理系统之一,广泛应用于各种规模的应用程序中,包括Web应用程序、企业内部系统等。本文将详细介绍MySQL的一些基本命令以及如何在Java中访问MySQL数据库。 1. **启动MySQL...

    mysql实现自动创建与删除分区

    MySQL数据库在大数据处理中扮演着重要角色,而分区技术是其优化查询性能的关键特性之一。本文将深入探讨如何实现MySQL的自动创建与删除分区,主要关注时间分区,并介绍相关存储过程和事件的设置。 首先,我们需要...

    mysql递归查询.doc

    MySQL 递归查询实现多分类查询 MySQL 递归查询是指在 MySQL 数据库中使用递归函数来实现树形结构数据的查询,例如部门表中某个部门的所有下属部分或者某个部分的所有上级部门。 在 MySQL 中实现递归查询需要使用...

    mysql存储过程实例

    MySQL 存储过程实例 MySQL 存储过程实例详细介绍了 MySQL 存储过程的开发步骤,本节将通过具体的实例讲解 PHP 是如何操纵 MySQL 存储过程的。 创建存储过程 存储过程的创建是 MySQL 存储过程的基础,MySQL 5.0 ...

    MySQL创建存储过程批量插入10万条数据

    MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...

    mysql中造3千条数据(3种方法)

    delimiter $$ DROP PROCEDURE IF EXISTS data; CREATE PROCEDURE data(in i int) BEGIN WHILE i INSERT INTO goods VALUES('', '锤子手机', i); SET i=i+1; END WHILE; END$$ set @id=0; call data(@id); ``` ...

    mysql雪花算法生成唯一整型ID主键的实现方法

    MySQL 雪花算法生成唯一整型ID主键的实现主要针对大数据环境下,需要大量生成全局唯一ID的需求。雪花算法是一种分布式ID生成策略,由Twitter开源,其设计目标是在分布式系统中生成具有全局唯一性、有序性和高并发性...

    传智播客Mysql 全集

    根据提供的文件信息,我们可以推断出这是一套关于MySQL数据库管理系统的教程集合。MySQL是一种非常流行的开源关系型数据库管理系统(RDBMS),被广泛应用于各种规模的企业和个人项目中。接下来,我们将围绕“传智...

    MySQL进阶-讲义

    ### MySQL进阶知识点详解 #### 一、MySQL高级应用概览 MySQL作为一款广泛使用的开源关系型数据库管理系统,其高级应用对于提升数据处理效率、增强数据安全性等方面具有重要意义。本讲义将深入探讨MySQL的几个核心...

    SQL导出MySQL单个存储过程.txt

    SQL语句对单个的MySQL存储过程导出 首先确保参数secure-file-priv='' 表示不限制mysqld在任意目录的导入导出 打开my.cnf或my.ini,加入如下语句后重启mysql服务。 secure_file_priv='' sql语法只修改下面的...

Global site tag (gtag.js) - Google Analytics