创建存储过程:
语法:
CREATE PROCEDURE p()
BEGIN
END
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(pro_price) AS priceaverage
FROM products;
END;
# begin…end之间是存储过程的主体定义
# mysql的分界符是分号(;)
调用存储过程的方法是:
# CALL加上过程名以及一个括号
# 例如调用上面定义的存储过程
CALL productpricing();
# 哪怕是不用传递参数,存储过程名字后面的括号“()”也是必须的
删除存储过程的方法是:
DROP PROCUDURE productpricing;
创建带参数的存储过程:
CREATE PROCUDURE productpricing(
OUT p1 DECIMAL(8,2),
OUT ph DECIMAL(8,2),
OUT pa DECIMAL(8,2)
)
BEGIN
SELECT Min(prod_price) INTO pl FROM products;
SELECT Max(prod_price) INTO ph FROM products;
SELECT Avg(prod_price) INTO pa FROM products;
END;
# DECIMAL用于指定参数的数据类型
# OUT用于表明此值是用于从存储过程里输出的
# MySQL支持 OUT, IN, INOUT
调用带参数的存储过程:
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);
# 所有的参数必须以@开头
# 要想获取@priceaverage的值,用以下语句
SELECT @priceaverage;
# 获取三个的值,用以下语句
SELECT @pricehigh, @pricelow, @priceaverage;
另一个带IN和OUT参数的存储过程:
CREATE PROCEDURE ordertotal(
IN onumber INT,
OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal;
END;
CALL ordertotal(20005, @total);
SELECT @total;
添加一个完整的例子这是一个自定义分页的存储过程)
DELIMITER $
DROP PROCEDURE IF EXISTS `dbcall`.`get_page`$
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_page`(
tableName varchar(100),
fieldsNames varchar(100),
pageIndex int,
pageSize int,
sortName varchar(500),
strWhere varchar(500)
)
BEGIN
DECLARE fieldlist varchar(200);
if fieldsNames=''||fieldsNames=null THEN
set fieldlist='*';
else
set fieldlist=fieldsNames;
end if;
if strWhere=''||strWhere=null then
if sortName=''||sortName=null then
set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize);
else
set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' ORDER BY ',sortName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize);
end if;
else
if sortName=''||sortName=null then
set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' WHERE ',strWhere,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize);
else
set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' WHERE ',strWhere,' ORDER BY ',sortName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize);
end if;
end if;
PREPARE stmt1 FROM @strSQL;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END$
DELIMITER ;
例子:统计一个月以内,每个支付金额在每天中的数量。
比如说: 有一天, 有10000个交易,其中有1000个充值的金额为100等,就是要统计每天中每个交易额的数量。
DELIMITER //
DROP PROCEDURE IF EXISTS test.GetAllProducts//
CREATE PROCEDURE test.GetAllProducts(IN start_time varchar(20),IN end_time varchar(20))
BEGIN
DECLARE i,num int default 0;
SET @condition = '';
SELECT count(distinct(amount)) into num from trade_log;
WHILE i < num DO
-- select i;
set @index = i;
set @tmp = null;
PREPARE stnm FROM 'SELECT distinct(amount) into @tmp from trade_log limit ?,1';
execute stnm using @index;
-- select @tmp;
set @condition = concat(@condition,"sum(if(amount = ",@tmp,",1,0)) as m",@tmp,",");
-- select @condition;
set i = i + 1;
END WHILE;
-- SET condition = SUBSTRING(@condition,1,LENGTH(@condition)-1);
SET @start = start_time;
SET @end = end_time;
SET @where = concat('create_time >= UNIX_TIMESTAMP("',@start,'") and create_time <= UNIX_TIMESTAMP("',@end,'") group by time');
SET @s = concat('select ',@condition,"FROM_UNIXTIME(create_time,'%Y-%m-%d') as time from trade_log where ",@where);
PREPARE stmt FROM @s;
EXECUTE stmt;
END //
DELIMITER ;
使用过程函数:
set @start = "2010-8-17";
set @end = "2010-9-17";
call GetAllProducts(@start,@end);/////测试表结构+------+------+------+------+------+------+------+------+------+------+------------+
| m50 | m200 | m100 | m10 | m400 | m240 | m55 | m110 | m500 | m480 | time |
+------+------+------+------+------+------+------+------+------+------+------------+
| 0 | 0 | 4 | 2 | 0 | 9 | 2 | 5 | 0 | 9 | 2010-08-17 |
| 0 | 0 | 0 | 0 | 1 | 2 | 2 | 5 | 0 | 4 | 2010-08-18 |
