前面讨论过,在做排行榜数据更新时,比较适合使用存储过程,原因有以下几点:

        1、生成存储过程时将要执行的数据库语句编译后存入数据库,避免每次执行都要编译的麻烦,提高效率。

        2、存储过程可以在需要的时候随时调用简单的 call basename.procname() 语句即可,方便调试与测试。

        3、可以与程序交互,调用返回时表示存储过程执行完毕,如果成功则可以让程序放心地拉数据,如果失败则会返回错误原因。

    当然,存储过程的用处远远不止于此。存储过程的编写基本上有以下格式:


DROP PROCEDURE IF EXIST UPDATE_RANK;

DELIMITER //

CREATE PROCEDURE UPDATE_RANK()
BEGIN

--------------------------
-- do something
--------------------------

END ;

//
DELIMITER ;

    其中,DELIMITER可以指定语句的结束符。在创建存储过程时可以在括号中指定输入或输出变量:in/out  varname  vartype ,in表示在执行时向数据库输入,out则可以将存储过程之后的变量返回。要执行则调用 call UPDATE_RANK(); 即可。

    以下则是一个实际的例子,虽然有些牵强:


DELIMITER $$
DROP PROCEDURE IF EXIST create_accounts$$
create procedure `create_accounts`(in maxcount int , in prefix char(72))
BEGIN
declare i int default maxcount;

while i > 0
do
insert into account set id=i,name=CONCAT(prefix,i);
set i = i - 1;
end while;

end$$

DELIMITER ;

call create_accounts(1000 , 'test');

    这个例子是往账号表中批量插入测试账号的,指定了两个输入变量,一个是账号数量,另一个则是账号名的前缀。最后在调用call之后则会插入1000个test*的账号名到账号表。