首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

MySQL存储过程中的文法学习

2013-01-26 
MySQL存储过程中的语法学习一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。创建存储

MySQL存储过程中的语法学习

一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。

创建存储过程:

?

语法:

?

  1. CREATE PROCEDURE p() BEGIN

?

此存储过程的正文

?

  1. END CREATE PROCEDURE productpricing()
  2. BEGIN SELECT Avg(pro_price) AS priceaverage
  3. FROM products; END;

?

begin…end之间是存储过程的主体定义

MySQL的分界符是分号(;)

?

调用存储过程的方法是:

?

CALL加上过程名以及一个括号

例如调用上面定义的存储过程

?

  1. CALL productpricing();

哪怕是不用传递参数,存储过程名字后面的括号“()”也是必须的

删除存储过程的方法是

  1. DROP PROCUDURE productpricing;

创建带参数的存储过程:

?

?

  1. CREATE PROCUDURE productpricing( OUT p1 DECIMAL(8,2),
  2. OUT ph DECIMAL(8,2), OUT pa DECIMAL(8,2)
  3. ) BEGIN
  4. SELECT Min(prod_price) INTO pl FROM products; SELECT Max(prod_price) INTO ph FROM products;
  5. SELECT Avg(prod_price) INTO pa FROM products; END;

?

DECIMAL用于指定参数的数据类型

OUT用于表明此值是用于从存储过程里输出的

MySQL支持 OUT, IN, INOUT

调用带参数的存储过程:

?

?

  1. CALL productpricing(@pricelow, @pricehigh,
  2. @priceaverage);

?

所有的参数必须以@开头

要想获取@priceaverage的值,用以下语句

?

  1. SELECT @priceaverage;

获取三个的值,用以下语句

  1. SELECT @pricehigh, @pricelow, @priceaverage;

另一个带IN和OUT参数的存储过程:

?

?

  1. CREATE PROCEDURE ordertotal( IN onumber INT,
  2. OUT ototal DECIMAL(8,2) )
  3. BEGIN SELECT Sum(item_price*quantity)
  4. FROM orderitems WHERE order_num = onumber
  5. INTO ototal; END;
  6. CALL ordertotal(20005, @total); SELECT @total;

添加一个完整的例子:(这是一个自定义分页的存储过程)

?

  1. DELIMITER $$ DROP PROCEDURE IF EXISTS `dbcall`.`get_page`$$
  2. CREATE DEFINER=`root`@`localhost` PROCEDURE `get_page`( /**//*Table name*/
  3. tableName varchar(100), /**//*Fileds to display*/
  4. fieldsNames varchar(100), /**//*Page index*/
  5. pageIndex int, /**//*Page Size*/
  6. pageSize int, /**//*Field to sort*/
  7. sortName varchar(500), /**//*Condition*/
  8. strWhere varchar(500) )
  9. BEGIN DECLARE fieldlist varchar(200);
  10. if fieldsNames=''||fieldsNames=null THEN set fieldlist='*';
  11. else set fieldlist=fieldsNames;
  12. end if; if strWhere=''||strWhere=null then
  13. if sortName=''||sortName=null then set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize);
  14. else set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' ORDER BY ',sortName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize);
  15. end if; else
  16. if sortName=''||sortName=null then set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' WHERE ',strWhere,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize);
  17. else set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' WHERE ',strWhere,'
    ORDER BY ',sortName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize);
  18. end if; end if;
  19. PREPARE stmt1 FROM @strSQL; EXECUTE stmt1;
  20. DEALLOCATE PREPARE stmt1; END$$
  21. DELIMITER ;

热点排行