`

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解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。

    csharp mysql客户端类

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

    MySQL存储过程的异常处理方法

    mysql&gt; delimiter $$ mysql&gt; mysql&gt; CREATE PROCEDURE myProc -&gt; (p_first_name VARCHAR(30), -&gt; p_last_name VARCHAR(30), -&gt; p_city VARCHAR(30), -&gt; p_description VARCHAR(30), -&gt; OUT p_sqlcode INT, -&gt; ...

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

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

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

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

    MySQL 数据库结构管理小工具,MySQL 表、视图、触发器、函数、过程结构同步管理MySQL DDL

    MySQL 数据库结构管理小工具,MySQL 表、视图、触发器、函数、过程结构同步管理,支持MySQL5.x ~ MySQL8,可保存创建对象的选择,导出SQL,当表、过程超过100着实令人头大,特意读取了表等的创建时间,可根据时间...

    socket身份校验(存储过程)mysql数据库

    服务器端导入MySql.Data.dll包并using MySql.Data.MySqlClient; 用mysql的存储过程查询表中的数据 mysql数据库 tb_users表 use test; DROP TABLE IF EXISTS tb_users; CREATE TABLE IF NOT EXISTS tb_users ( id ...

    mysql中存储过程的实例教程

    ( 1 ) MySQL 存储过程是在 “ 命令提示符 ” 下创建的 , 所以首先应该打开 “ 命令提示符 ” 窗 口。 ( 2 )进入 “ 命令提示符 ” 窗口后,首先应该登录 MySQL 数据库服务器,在 “ 命令提示符 ” 下输入如下...

    PHP MYSQL 脚本运行器

    这个是一个单页面的MySQL脚本执行程序,PHP写的,当无法通过远程客户端连接MySQL,同时空间服务商提供的数据库管理器版本过低无法创建存储过程(因为要用到DELIMITER)的时候,可以用这个小东西,只有几K,比起穿上一...

    mysql技巧总结大全

    在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为 当使用delimiter命令时 你应该避免使用反斜杠 ‘&quot;’ 字符 因为那是MySQL的转义字符 "&gt;CREATE PROCEDURE存储过程名 参数列表 BEGIN ...

    MySQL 自定义函数CREATE FUNCTION示例

    mysql&gt; delimiter $$ mysql&gt; mysql&gt; CREATE FUNCTION myFunction -&gt; (in_string VARCHAR(255), -&gt; in_find_str VARCHAR(20), -&gt; in_repl_str VARCHAR(20)) -&gt; -&gt; RETURNS VARCHAR(255) -&gt; BEGIN -&gt; DECLARE l_new_...

    mysql表数据定时随机生成.txt

    DELIMITER $$ ALTER DEFINER=`root`@`%` EVENT `NewEvent` ON SCHEDULE EVERY 30 SECOND STARTS '2018-10-08 14:00:00' ON COMPLETION NOT PRESERVE ENABLE DO CALL update_a()$$ DELIMITER ; 储存...

    MySQL存储过程中使用WHILE循环语句的方法

    mysql&gt; delimiter $$ mysql&gt; mysql&gt; CREATE PROCEDURE myProc() -&gt; BEGIN -&gt; -&gt; DECLARE i int; -&gt; SET i=1; -&gt; loop1: WHILE i&lt;=10 DO -&gt; IF MOD(i,2)&lt;&gt;0 THEN /*Even number - try again*/ -&gt; SELECT...

    MySQL数据库:流程控制语句while语句.pptx

    MySQL支持3条用来创建循环的语句:WHILE、REPEAT和LOOP语句。 WHILE语句语法格式为: [begin_label:] WHILE search_condition DO statement_list END WHILE [end_label] 说明:语句首先判断search_condition是否为真...

    MySQL数据库:流程控制语句loop.pptx

    DELIMITER $$ CREATE PROCEDURE doloop() BEGIN declare a int; SET a=10; Label: LOOP SET a=a-1; IF a LEAVE Label; END IF; END LOOP Label; END$$ DELIMITER ; 调用验证:call dowhile(); 注:在存储过程里面...

    MySql函数-取一个字符串分隔后指定位置的子字符串

    一、函数功能:对字符串进行分隔数组,取指定顺序位置的子字符串,支持左右双向获取,支持...二、函数格式:fn_get_split_val(in_str varchar,in_delimiter varchar,in_order int,in_default varchar) 三、测试用例

Global site tag (gtag.js) - Google Analytics