以下的文章主要是向大家描述的是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的真正用途,delimiter在mysql很多地方出现,比如存储过程、触发器、函数等。 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其解。 其实就是告诉mysql解释器,该段命令...
MYSQL导出一个SQL后: DELIMITER $$ DROP TRIGGER IF EXISTS `updateegopriceondelete`$$ CREATE TRIGGER `updateegopriceondelete` AFTER DELETE ON `customerinfo` FOR EACH ROW BEGIN DELETE FROM egoprice ...
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。
为解决在使用官方客户端类执行mysql脚本时,仅用Execute方法,不支持返回数据结果集的问题, 参照官方MySql.Data.dll中的源码写了一个扩展类,可以执行 MySQL Workbench中可执行的任何脚本,并返回select结果集到一...
mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc -> (p_first_name VARCHAR(30), -> p_last_name VARCHAR(30), -> p_city VARCHAR(30), -> p_description VARCHAR(30), -> OUT p_sqlcode INT, -> ...
MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...
SQL语句对单个的MySQL存储过程导出 首先确保参数secure-file-priv='' 表示不限制mysqld在任意目录的导入导出 打开my.cnf或my.ini,加入如下语句后重启mysql服务。 secure_file_priv='' sql语法只修改下面的...
MySQL 数据库结构管理小工具,MySQL 表、视图、触发器、函数、过程结构同步管理,支持MySQL5.x ~ MySQL8,可保存创建对象的选择,导出SQL,当表、过程超过100着实令人头大,特意读取了表等的创建时间,可根据时间...
服务器端导入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 ...
( 1 ) MySQL 存储过程是在 “ 命令提示符 ” 下创建的 , 所以首先应该打开 “ 命令提示符 ” 窗 口。 ( 2 )进入 “ 命令提示符 ” 窗口后,首先应该登录 MySQL 数据库服务器,在 “ 命令提示符 ” 下输入如下...
这个是一个单页面的MySQL脚本执行程序,PHP写的,当无法通过远程客户端连接MySQL,同时空间服务商提供的数据库管理器版本过低无法创建存储过程(因为要用到DELIMITER)的时候,可以用这个小东西,只有几K,比起穿上一...
在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为 当使用delimiter命令时 你应该避免使用反斜杠 ‘"’ 字符 因为那是MySQL的转义字符 ">CREATE PROCEDURE存储过程名 参数列表 BEGIN ...
mysql> delimiter $$ mysql> mysql> CREATE FUNCTION myFunction -> (in_string VARCHAR(255), -> in_find_str VARCHAR(20), -> in_repl_str VARCHAR(20)) -> -> RETURNS VARCHAR(255) -> BEGIN -> DECLARE l_new_...
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> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc() -> BEGIN -> -> DECLARE i int; -> SET i=1; -> loop1: WHILE i<=10 DO -> IF MOD(i,2)<>0 THEN /*Even number - try again*/ -> SELECT...
MySQL支持3条用来创建循环的语句:WHILE、REPEAT和LOOP语句。 WHILE语句语法格式为: [begin_label:] WHILE search_condition DO statement_list END WHILE [end_label] 说明:语句首先判断search_condition是否为真...
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(); 注:在存储过程里面...
一、函数功能:对字符串进行分隔数组,取指定顺序位置的子字符串,支持左右双向获取,支持...二、函数格式:fn_get_split_val(in_str varchar,in_delimiter varchar,in_order int,in_default varchar) 三、测试用例