MySQL一直被诟病的其中一个原因是没有存储过程,但是现在情况已经完全不同了,自5.0起,就加入了存储过程的功能,我写这篇文章的时候,MySQL的版本已经到了5.6,所以想在MySQL中使用存储过程不再是什么遥不可及的事情了。
存储过程简单一句话概括就是把一些sql的语句整合在一起,变成一个函数。
我们以实例来一步一步的学习MySQL的存储过程。
假设你已经安装5.0之后的MySQL,打开windows的命令行或者linux的终端,使用下列命令登入:
mysql -uroot -p
创建一个表,就以食物清单为例,2个列,一个id,一个名字
CREATE TABLE foods( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32));
接下来我们创建2个存储过程一个是插入食物,另外一个列出食物,只列出前10行。
在这之前,有个东西要解释一下,因为MySQL默认是分隔符是 ‘ ;’ , 也就是说当你输入 ‘;‘的时候,就认为你的命令输入已经结束,但是存储过程里面的各个语句的分隔用的也是这个符号,这样当我们输入一个sql语句的时候,就被执行了,这不是我们想要的,那怎么办呢?其实MySQL提供了修改默认命令结束符的命令。
delimiter
例如我们想要改成 // 那么就使用下面的命令:
delimiter //
这样默认的结束符就从 ’;‘ 变成了 ’//‘ 了。
接下来我们开始创建我们的第一个存储过程,命令如下:
CREATE PROCEDURE foodinsert( nm varchar(32))
BEGIN
INSERT INTO foods( name ) VALUES( nm );
END //
如果执行成功,命令行的输入如下:
Query OK, 0 rows affected (0.00 sec)
如果失败,mysql会提示你错误,一般是语法错误。
那怎么看我们刚刚创建的存储过程呢?使用如下命令:
SHOW CREATE PROCEDURE foodinsert;
发现回车不好使,命令没有被执行,是不?那是因为我们现在的命令结束符是 ’//‘, 你要么把上面命令中的 ’;‘ 变成 ’//‘, 要么再次使用delimiter命令修改命令结束符
delimiter ;
好了,再次执行上面的命令,就看到了我们的刚才创建的procedure了。
现在我们分析下它的格式,
CREATE PROCEDURE [存储过程名字] ([参数列表])
BEGIN
[变量声明]
[语句块]
END
比较一下上面的格式和我们刚才实际的例子,只是少了一个变量声明。上面的例子之中之所以没有变量声明是因为我们用不到,但是为了说明问题,我们还是加上几个变量声明。我们再次使用delimiter命令变换命令结束符
delimiter //
然后:
CREATE PROCEDURE foodinsert( nm varchar(32))
BEGIN
DECLARE var1 VARCHAR(32);
INSERT INTO foods( name ) VALUES( nm );
END //
回车,发现出错了
ERROR 1304 (42000): PROCEDURE foodinsert already exists
说foodinsert这个procedure已经存在了。对的,刚才已经创建了,那我们就删除原有的procedure吧,
DROP PROCEDURE foodinsert;
接着再次执行创建procedure的语句,这样我们的procedure就有了变量声明了。不知道聪明的你,是不是已经发现了无论是参数的声明还是变量的定义都是名字在前,类型在后。
接下来我们测试一下我们刚才创建的procedure,也就是调用它,调用是使用命令call,这里再次变换命令结束符到 ’;‘,然后执行下面的命令:
call foodinsert( ‘Curry Chicken’ );
或者是
set name=’Curry Chicken’;
call foodinsert( name );
然后再用select语句查看我们是否成功了在foods表中成功了插入一条记录。
select * from foods;
是不是已经看到刚才插入的数据了。
接下来我再把显示所有的记录的这个操作也变成一个存储过程,这里再次变换命令结束符到 ’//‘,然后执行下面的命令:
CREATE PROCEDURE foodshow( )
BEGIN
SELECT * FROM foods;
END //
这个存储过程参数列表为空,但是左右括号是不能丢的。
接下来测试这个存储过程,同样用call
call foodshow
是不是显示了全部的记录?那就对了。我们继续,接下来我们创建一个同名的存储过程foodshow,但是参数不同。刚才创建的没有参数,现在我们创建一个有参数,
CREATE PROCEDURE foodshow( ct int )
BEGIN
SELECT * FROM foods LIMIT ct;
END //
是不是出错了:
ERROR 1304 (42000): PROCEDURE foodshow already exists
说明什么,存储过程的定义并不是支持过程(函数)重载。 那么我们想实现显示所有和部分记录,怎么办?你可以用2个不同的函数名来实现,如果你就想用一个函数实现也可以,在过程里面判断一下输入,如果是0就显示所有记录,如果是大于0就显示部分了,因此这里涉及到过程中条件控制。先上实例,在这之前,删除原有的foodshow,
DROP PROCEDURE foodshow //
CREATE PROCEDURE foodshow( ct int )
BEGIN
IF ( ct == 0 ) THEN
SELECT * FROM foods LIMIT ct;
ELSE IF( ct >0 )
SELECT *FROM LIMIT ct;
ELSE
END IF;
END //
回车,这样我们就成功了创建一个既能输入部分又能输入全部的一个存储过程。看下条件语句吧:
IF (条件) THEN
….
ELSE IF (条件)
….
ELSE
….
END IF
如果想查看所有创建存储过程,使用如下的命令:
SHOW PROCEDURE STATUS
如果想修改已有的存储过程,使用如下命令:
ALTER PROCEDURE [过程名]
这只是一个简单的入门,如果想要了解更多,请参看我接下来的文章。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.