日期:2014-05-16  浏览次数:20677 次

MySQL存储过程中的语法学习

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

创建存储过程:

?

语法:

?

  1. CREATE PROCEDURE p()
  2. BEGIN

?

此存储过程的正文

?

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

?

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

MySQL的分界符是分号(;)

?

调用存储过程的方法是:

?

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

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

?

  1. CALL productpricing();

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

删除存储过程的方法是

  1. DROP PROCUDURE productpricing;

创建带参数的存储过程:

?

?

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

?

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

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

MySQL支持 OUT, IN, INOUT

调用带参数的存储过程:

?

?

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

?

所有的参数必须以@开头

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

?

  1. SELECT @priceaverage;

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

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

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

?

?

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

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

?

  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `dbcall`.`get_page`$$
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `get_page`(
  4. /**//*Table name*/
  5. tableName varchar(100),
  6. /**//*Fileds to display*/
  7. fieldsNames varchar(100),
  8. /**//*Page index*/
  9. pageIndex int,
  10. /**//*Page Size*/
  11. pageSize int,
  12. /**//*Field to sort*/
  13. sortName varchar(500),
  14. /**//*Condition*/
  15. strWhere varchar(500)
  16. )