zoukankan      html  css  js  c++  java
  • MySQL存储过程(1) 语法学习

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

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

    创建存储过程:

    语法:
    
    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;

    另一个带INOUT参数的存储过程:

    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`(
        /**//*Table name*/
        tableName varchar(100),
        /**//*Fileds to display*/
        fieldsNames varchar(100),
        /**//*Page index*/
        pageIndex int,
        /**//*Page Size*/
        pageSize int,  
        /**//*Field to sort*/
        sortName varchar(500),
        /**//*Condition*/
        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 ;
  • 相关阅读:
    Danny_Su的devexpress 9.3.3的注册插件在vs2010RC中无法使用的解决办法
    EntitySpaces2009中的关系
    EntitySpaces2009的开发文档地址
    EntitySpaces2009支持事务
    EntitySpaces2009中连接Access的连接设置
    基于matlab的视频测速处理
    图像拼接与融合
    某图像分析系统
    黑子数与开盘指数相关性分析
    另类的图像处理
  • 原文地址:https://www.cnblogs.com/sunscheung/p/4626946.html
Copyright © 2011-2022 走看看