转载自: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> 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> 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> 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存储过程简单实例
转自:http://www.cnblogs.com/zhuawang/p/4185302.html ********************* 创建表 ************************ ...
- mysql存储过程的学习(mysql提高执行效率之进阶过程)
1:存储过程: 答:存储过程是sql语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理:存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户声明变量以及进行流程控制,存储类型可以接受 ...
- mysql 存储过程简单实例
一.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...
- mysql存储过程简单例子
1.之前经常在oracle数据库中使用存储过程,换到mysql后用的不多,但是有时候也用,大致记录一下,基本和oracle的一样. CREATE DEFINER = `root`@`%` PROCED ...
- Mysql存储过程简单应用
因为很久没写过存储过程了,语法也不记得了,靠百度后,解决了当前问题,这里就简单记录一下. CREATE PROCEDURE pro1() BEGIN DECLARE i int; DECLARE db ...
- mysql存储过程简单用法
show procedure status 查看所有存储过程 <!-- 简单存储过程 --> 先将结束符改成// delimiter // create procedure query ...
- mysql存储过程的学习
平时在工作中写过很多存储过程,但有时候对某些存储过程还是有些困惑的,所以发一篇文章记录下. 标准存储过程写法 create procedure`myQueryTask`( IN Task_No VAR ...
- MySql 存储过程实例(附完整注释)
将下面的语句复制粘贴可以一次性执行完,我已经测试过,没有问题! MySql存储过程简单实例: ...
- 创建MySQL存储过程示例
创建MySQL存储过程是学习MySQL数据库必须要掌握的知识,下文对创建MySQL存储过程作了详细的介绍,供您参考学习. AD:2013大数据全球技术峰会课程PPT下载 下文将教您如何创建MySQL存 ...
随机推荐
- vue.js 源代码学习笔记 ----- $watcher
/* @flow */ import { queueWatcher } from './scheduler' import Dep, { pushTarget, popTarget } from '. ...
- PostgreSQL日志号LSN和wal日志文件简记
弄明白日志号的原理之后,一段时间又有点忘记了,干脆整理一遍: (一)wal文件命名规则 1)在$PGDATA目录下面的pg_xlog目录中存放着xlog日志文件(10.1之后变为了pg_wal): t ...
- GNU Autotools的使用方法
手工写Makefile是一件很有趣的事情,对于比较大型的项目,如果有工具可以代劳,自然是一件好事.在Linux系统开发环境中,GNU Autotools 无疑就充当了这个重要角色.(在Windows系 ...
- (四) ffmpeg filter学习-filter命令学习
http://blog.csdn.net/joee33/article/details/51946712 http://blog.csdn.net/tkp2014/article/details/53 ...
- 基于视觉的 SLAM/Visual Odometry (VO) 开源资料、博客和论文列表
基于视觉的 SLAM/Visual Odometry (VO) 开源资料.博客和论文列表 以下为机器翻译,具体参考原文: https://github.com/tzutalin/awesome-vis ...
- [Python] 计算dataframe某一文本维度的平均长度
print np.mean(df.title.apply(lambda x: len(x))) # 24.072694718 print df.title.apply(lambda x: len(x) ...
- Java中级面试题——(上)
List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...
- C语言变量、函数的作用域及变量的存储方式
一.变量的作用域和存储方式 在C语言中每个变量都有两种基本属性:数据类型.数据的存储类别. 数据类型很多人都已熟知,例如:字符型(char).整型(int).浮点型(float)等等.存储类别是指数据 ...
- C# 速编神器LinqPad(新版5.25)
点此下载5.25 (支持.net4.6,有调试器)(页面有广告,一直点免费下载即可)(可用)密码 lp123456 批处理如下. @echo off start /b LINQPad.exe -n ...
- selenium-java,解决一些加了显性等待和隐性等待都不好使的情况,以及给UI自动化加上暂停功能
最近在UI自动化时遇到了,上一步成功操作后没有响应的情况(动画加载和浏览器加载导致实际没有问题),导致下一步无法成功操作,所有想在尝试2次操作后再次进行上一步操作解决这种情况导致的错误(其实是不想每一 ...