转载自:http://blog.chinaunix.net/uid-23302288-id-3785111.html
■存储过程Stored Procedure
存储过程就是保存一系列SQL命令的集合,将这些sql命令有组织的形成一个小程序,这样会实现很复杂的处理
SQL基本是一个命令一个命令执行,虽然可以通过连接、子查询等实现些高级的处理,但局限性是显而易见的
■存储过程的优势
1.提高执行性能(存储过程事先完成了解析、编译的处理,执行时能减轻数据库负担)
2.可减轻网络负担(比起多次传递SQL命令本身,这大大减轻了网络负担)
3.可防止对表的直接访问(可只赋予用户对相关存储过程的访问权限)
4.存储过程会保存在数据库中,应用程序只需要知道调用哪个存储过程就可以完成相应处理
■使用存储过程
参数种类分为: IN(输入型),OUT(输出型), INOUT(输入输出型)
SELECT column1..  INTO 变量1... FROM table1 WHERE xxx;   //这个变量1对应OUT,INOUT
create procedure 存储过程名(
    参数种类1  参数1  参数类型1
    参数种类2  参数2  参数类型2...)
begin
    处理内容
end
 
DELIMITER //
CREATE PROCEDURE search_customer(
        IN  p_nam VARCHAR(20))
BEGIN
        IF p_nam IS NULL OR p_nam = '' THEN
                 SELECT * FROM customer;
        ELSE 
                 SELECT * FROM customer WHERE nam LIKE p_nam;
        END IF;
END
//
DELIMITER ;
 
注意事项
1.DELIMITER命令改变分隔符
  默认分隔符是';' 存储过程中肯定会有';' ,所以使用其将分隔符改为'//' , 创建好后,在将分隔符改回';'
2.可使用的控制语句
IF语句
IF situation=1  THEN
         command1;
ELSEIF  situation=2  THEN
         command2;
ELSE
         command3;
END IF ;
CASE语句
CASE  situation
        WHEN 1 THEN  command1;
        WHEN 2 THEN  command2;
        WHEN 3 THEN  command3;
        ELSE               command4;
END CASE;
WHILE (前置判断)       根据条件,循环有可能一次不执行
WHILE  situation >1 DO
        command1;
END WHILE;
REPEAT (后置判断)     不论条件如何,循环至少会执行一次 command1
REPEAT 
        command1;
UNTIL situation<=1  END REPEAT;
3.查看创建的存储过程状态
SHOW PROCEDURE STATUS \G;
SHOW CREATE PROCEDURE search_nam \G;
4.删除存储过程
DROP PROCEDURE search_nam;
5.执行存储过程
CALL search_nam('li%');
CALL search_nam('');
        
创建存储函数
mysql> DELIMITER //                      
mysql> CREATE PROCEDURE search_nam(  
    ->       IN p_nam VARCHAR(20))
    -> BEGIN 
    ->       IF p_nam IS NULL OR p_nam='' THEN
    ->            SELECT * FROM USER3;
    ->       ELSE  
    ->            SELECT * FROM USER3 WHERE name LIKE p_nam;    
    ->       END IF;
    -> END
    -> //
Query OK, 0 rows affected (0.05 sec)
 
mysql> DELIMITER ;
查看创建的存储函数语句
mysql> SHOW CREATE PROCEDURE search_nam \G;
*************************** 1. row ***************************
       Procedure: search_nam
        sql_mode: 
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `search_nam`(
      IN p_nam VARCHAR(20))
BEGIN 
      IF p_nam IS NULL OR p_nam='' THEN
           SELECT * FROM USER3;
      ELSE
           SELECT * FROM USER3 WHERE name LIKE p_nam;
      END IF;
END
1 row in set (0.00 sec)
查看创建的存储函数状态
mysql> SHOW PROCEDURE STATUS \G;
*************************** 1. row ***************************
           Db: test
         Name: search_nam
         Type: PROCEDURE
      Definer: root@localhost
     Modified: 2011-08-13 05:40:12
      Created: 2011-08-13 05:40:12
Security_type: DEFINER
      Comment: 
1 row in set (0.00 sec)
 
调用存储过程  成功
mysql> CALL search_nam('aa%');
+------+------+
| id   | name |
+------+------+
|    1 | aaa  | 
+------+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
 
mysql> CALL search_nam('');   
+------+------+
| id   | name |
+------+------+
|    1 | aaa  | 
|    2 | bbb  | 
|    3 | ccc  | 
+------+------+
3 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
 
演示OUT类型参数
mysql> DELIMITER //
mysql> CREATE PROCEDURE search_nam2(
    ->      IN p_nam VARCHAR(20),
    ->      OUT p_num INT)
    -> BEGIN 
    ->      IF p_nam IS NULL OR p_nam='' THEN
    ->           SELECT * FROM user3;
    ->      ELSE        
    ->           SELECT * FROM USER3 WHERE name LIKE p_nam;
    ->      END IF;
    ->      SELECT FOUND_ROWS() INTO p_num;
    -> END
    -> //
mysql> DELIMITER ;
mysql> SHOW PROCEDURE STATUS ;
+------+-------------+-----------+----------------+---------------------+---------------------+
| Db   | Name        | Type      | Definer        | Modified            | Created             |
+------+-------------+-----------+----------------+---------------------+---------------------+
| test | search_nam  | PROCEDURE | root@localhost | 2011-08-13 05:40:12 | 2011-08-13 05:40:12 |
| test | search_nam2 | PROCEDURE | root@localhost | 2011-08-13 05:56:37 | 2011-08-13 05:56:37 |
+------+-------------+-----------+----------------+---------------------+---------------------+
2 rows in set (0.00 sec)
 
调用成功
mysql> CALL search_nam3('bb%',@num); 
+------+------+
| id   | name |
+------+------+
|    2 | bbb  | 
+------+------+
1 row in set (0.00 sec)
 
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @num;
+------+
| @num |
+------+
| 1    | 
+------+
1 row in set (0.00 sec)
 
IF多分枝演示
mysql> DELIMITER //                
mysql> CREATE PROCEDURE depart(    
    ->      IN de_nam VARCHAR(10))
    -> BEGIN
    ->      IF de_nam=1 THEN 
    ->              SELECT * FROM USER3 WHERE depart='IT';  
    ->      ELSEIF de_nam=2 THEN
    ->              SELECT * FROM USER3 WHERE depart='HR';
    ->      ELSE 
    ->              SELECT * FROM USER3 WHERE depart='BOSS';
    ->      END IF;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL depart(2);               //演示成功
+------+------+--------+
| id   | name | depart |
+------+------+--------+
|    2 | bbb  | HR     | 
+------+------+--------+
1 row in set (0.00 sec)
CASE演示
mysql> DELIMITER //
mysql> CREATE PROCEDURE depart2(
    ->       IN de_num INT)
    -> BEGIN
    ->       CASE de_num
    ->       WHEN 1 THEN 
    ->              SELECT * FROM USER3 WHERE depart='IT';
    ->       WHEN 2 THEN
    ->              SELECT * FROM USER3 WHERE depart='HR';    
    ->       ELSE 
    ->              SELECT * FROM USER3 WHERE depart='BOSS';  
    ->       END CASE;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ; 
mysql> CALL depart2(1);
+------+------+--------+
| id   | name | depart |
+------+------+--------+
|    1 | aaa  | IT     | 
+------+------+--------+
1 row in set (0.00 sec)
 
Query OK, 0 rows affected (0.00 sec)        //演示成功
mysql> CALL depart2(2);  
+------+------+--------+
| id   | name | depart |
+------+------+--------+
|    2 | bbb  | HR     | 
+------+------+--------+
1 row in set (0.00 sec)
 
声明局部变量:
DECLARE tmp CHAR(10) [值];
给变量赋值:
SET tmp='值' ;

mysql> DELIMITER //    
mysql> CREATE PROCEDURE depart3( 
    ->       IN p_num INT)
    -> BEGIN
    ->       DECLARE tmp CHAR(5);
    ->       CASE p_num
    ->       WHEN 1 THEN 
    ->              SET tmp='IT';  
    ->       WHEN 2 THEN
    ->              SET tmp='HR';
    ->       ELSE 
    ->              SET tmp='BOSS';
    ->       END CASE;
    ->        
SELECT * FROM USER3 WHERE depart=tmp;
    -> END
    -> //
mysql> DELIMITER ; 
mysql> call depart3(1);
+------+------+--------+
| id   | name | depart |
+------+------+--------+
|    1 | aaa  | IT     | 
+------+------+--------+
1 row in set (0.00 sec)
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> call depart3(2);                   //调用成功
+------+------+--------+
| id   | name | depart |
+------+------+--------+
|    2 | bbb  | HR     | 
+------+------+--------+
1 row in set (0.00 sec)
 
演示while
mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_sum(
    ->       IN p_num INT,
    ->       OUT res INT)
    -> BEGIN
    ->       SET res=1;
    ->       WHILE p_num > 1 DO
    ->           SET res=res * p_num;
    ->           SET p_num=p_num - 1;
    ->       END WHILE;
    -> END 
    -> //
Query OK, 0 rows affected (0.00 sec) 
mysql> DELIMITER ;  
mysql> CALL sp_sum(5,@res); 
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @res;                                     //演示成功
+------+
| @res |
+------+
| 120  | 
+------+
1 row in set (0.00 sec)
演示repeat
mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_sum2(
    ->         IN p_num INT,
    ->         OUT res INT)
    -> BEGIN
    ->         SET res = 1;
    ->         REPEAT 
    ->              SET res=res * p_num;
    ->              SET p_num=p_sum - 1; 
    ->         UNTIL p_num < 2 END REPEAT;
    -> END
    -> //
mysql> DELIMITER ;
 
mysql> CALL sp_sum2(5,@res);
Query OK, 0 rows affected (0.00 sec)              //调用成功
mysql> SELECT @res;
+------+
| @res |
+------+
| 120  | 
+------+
1 row in set (0.00 sec)

mysql 存储过程简单学习的更多相关文章

  1. MySql存储过程简单实例

    转自:http://www.cnblogs.com/zhuawang/p/4185302.html ********************* 创建表 ************************ ...

  2. mysql存储过程的学习(mysql提高执行效率之进阶过程)

    1:存储过程: 答:存储过程是sql语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理:存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户声明变量以及进行流程控制,存储类型可以接受 ...

  3. mysql 存储过程简单实例

    一.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...

  4. mysql存储过程简单例子

    1.之前经常在oracle数据库中使用存储过程,换到mysql后用的不多,但是有时候也用,大致记录一下,基本和oracle的一样. CREATE DEFINER = `root`@`%` PROCED ...

  5. Mysql存储过程简单应用

    因为很久没写过存储过程了,语法也不记得了,靠百度后,解决了当前问题,这里就简单记录一下. CREATE PROCEDURE pro1() BEGIN DECLARE i int; DECLARE db ...

  6. mysql存储过程简单用法

    show procedure status 查看所有存储过程 <!--  简单存储过程  --> 先将结束符改成// delimiter // create procedure query ...

  7. mysql存储过程的学习

    平时在工作中写过很多存储过程,但有时候对某些存储过程还是有些困惑的,所以发一篇文章记录下. 标准存储过程写法 create procedure`myQueryTask`( IN Task_No VAR ...

  8. MySql 存储过程实例(附完整注释)

    将下面的语句复制粘贴可以一次性执行完,我已经测试过,没有问题! MySql存储过程简单实例:                                                       ...

  9. 创建MySQL存储过程示例

    创建MySQL存储过程是学习MySQL数据库必须要掌握的知识,下文对创建MySQL存储过程作了详细的介绍,供您参考学习. AD:2013大数据全球技术峰会课程PPT下载 下文将教您如何创建MySQL存 ...

随机推荐

  1. 201621123014《Java程序设计》第五周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:接口.interface.implements.Comparable.Comparator 1.2 尝试使用思维导图将这些关 ...

  2. Ubuntu12.04下samba服务器共享配置

    1 . 前置工作 首先保证你的Ubuntu能上网:虚拟机网络连接方式为NAT:虚拟机雨物理机互ping可通: 2. 安装samba sudo apt-get insall samba sudo apt ...

  3. New Concept English three (22)

    34w 54 Some plays are so successful that they run for years on end. In many ways, this is unfortunat ...

  4. easychm生成帮助文件时出现的目录导航乱码问题

    将html生成帮助文件时出现乱码问题的主要原因是:文件编译格式的问题 (一般的网页都是utf-8格式的,将其改为GB2312就可以了):

  5. reactNative 的一些学习

    手把手视频 学习资料大全 入门系列

  6. 为网站添加favicon.ico图标

    前言 貌似每次都是等到网站快收尾时才做favicon.ico的,这次也不例外.这年代…… 步骤 1.PS制作正方形图标,格式为jpg.jpeg.gif或png. 2.将图标转换为ICO格式,网上有很多 ...

  7. get、post接口测试-java

    public class HttpClient { //get请求方法 public String sendGet(String url, String data) { Date date = new ...

  8. hiho 1612

    emmmmm?A不了?90分是什么鬼 #include<cstdio> #include<cstdlib> #include<vector> #include< ...

  9. BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*

    BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...

  10. 为什么委托的减法(- 或 -=)可能出现非预期的结果?(Delegate Subtraction Has Unpredictable Result)

    当我们为一个委托写 -= 的时候,ReSharper 会提示“Delegate Subtraction Has Unpredictable Result”,即“委托的减法可能出现非预期的结果”.然而在 ...