转载自: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. 在创建一个MVC控制器,显示运行所选代码生成器时出错(带读写,使用EF)

    在创建一个MVC控制器,在Controllers文件夹选择添加->控制器,如下图: 显示运行所选代码生成器时出错 解决方法: 第一步:Install-Package Microsoft.aspn ...

  2. RHCS高可用集群配置(luci+ricci+fence)

    一.什么是RHCS    RHCS是Red Hat Cluster Suite的缩写,也就是红帽集群套件,RHCS是一个能够提供高可用性.高可靠性.负载均衡.存储共享且经济廉价的集群工具集合,它将集群 ...

  3. DR模式下的高可用的LVS(LVS+keepalived)

    一.keepalived 在DR模式下,使用Keepalived实现LVS的高可用.Keepalived的作用是检测服务器的状态,如果有一台web服务器 宕机,或工作出现故障,Keepalived将检 ...

  4. C#调用C++编译的DLL--

    引用 C#调用C++编译的DLL详解 可以单步跟踪进入dll的源码!每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认 ...

  5. wordpress 生成自定义 meta box

    工具 https://jeremyhixon.com/tool/wordpress-meta-box-generator/ 使用 生成代码 /** * Generated by the WordPre ...

  6. Linux sed命令操作 删除文件每一行的前k个字符、在文本的行尾或行首添加字符

    删除文件每一行的前k个字符 $ cat tmp.txt # 删除每行第一个字符 $ sed 's/.//' tmp.txt # 删除每行前两个字符 $ sed 's/..//' tmp.txt # 删 ...

  7. Android 实现两屏幕互相滑动

    Android 实现两屏幕互相滑动 下文来自: http://blog.csdn.net/song_shi_chao/article/details/7081664 ----------------- ...

  8. 自动化测试入门指南(3)-- 入门demo

    按照 自动化测试入门指南(2)-- 环境搭建搭建好环境后,我们继续一步步实现一个简单的入门例子 Step0. 安装Firefox浏览器(http://pan.baidu.com/s/1c00bw8g中 ...

  9. LOJ2359. 「NOIP2016」天天爱跑步【树上差分】

    LINK 思路 首先发现如果对于一个节点,假设一个节点需要统计从字数内来的贡献 需要满足\(dep_u - dep_s = w_u\) 这个条件其实可以转化成\(dep_u - w_u = dep_s ...

  10. 接口测试框架——第六篇-读Excel封装方法

    谢谢@小麦苹果的提醒,才发现我借口测试少写了一个文件,今天给大家补上: common->service->excel_case_data.py # coding: utf-8 import ...