避免编写重复的语句

安全性可控

执行效率高

14.1、创建存储过程和函数

14.1.1、创建存储过程

CREATE PROCEDUREsp_name ([proc_parameter[,...]])

[characteristic...] routine_body

procedure 发音 [prə'si:dʒə]

proc_parameter           IN|OUT|INOUT param_name type

characteristic               n. 特征;特性;特色

LANGUAGESQL                     默认,routine_boyd由SQL组成

[NOT]DETERMINISTIC          指明存储过程的执行结果是否是确定的,默认不确定

CONSTAINSSQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA指定程序使用SQL语句的限制

CONSTAINS SQL           子程序包含SQL,但不包含读写数据的语句,默认

NO SQL                        子程序中不包含SQL语句

READS SQL DATA                  子程序中包含读数据的语句

MODIFIES SQL DATA    子程序中包含了写数据的语句

SQLSECURITY {DEFINER|INVOKER},指明谁有权限执行。

DEFINER,只有定义者自己才能够执行,默认

INVOKER    表示调用者可以执行

COMMENT‘string’  注释信息

CREATE PROCEDURE num_from_employee (IN emp_id, INT, OUT count_num INT)

         READS SQL DATA

         BEGIN

                  SELECT COUNT(*)  INTO count_num

                  FROM employee

                  WHERE d_id=emp_id;

         END

14.1.2、创建存储函数

CREATE FUNCTION sp_name ([func_parameter[,...]])

RETURNS type

[characteristic...] routine_body

CREATEFUNCTION name_from_employee(emp_id INT)

         RETURNSVARCHAR(20)

         BEGIN

                  RETURN (SELECT name FROM employee WHEREnum=emp_id);

         END

14.1.3、变量的使用

1.定义变量

DECLARE var_name[,…]type [DEFAULT value]

DECLAREmy_sql INT DEFAULT 10;

2.为变量赋值

SET var_name=expr[,var_name=expr]…

SELECT col_name[,…]INTO var_name[,…] FROM table_name WHERE condition

14.1.4、定义条件和处理程序

1.定义条件

DECLARE condition_nameCONDITION FOR condition_value

condition value:

SQLSTATE[VALUE] sqlstate_value | mysql_error_code

对于ERROR 1146(42S02)

sqlstate_value: 42S02

mysql_error_code:1146

//方法一

DECLARE can_not_find CONDITION FOR SQLSTATE ‘42S02’

//方法二

DECLARE can_not_find CONDITION FOR 1146

2.定义处理程序

DECLARE hander_type HANDLER FOR condition_value[,…] sp_statement

handler_type:

CONTINUE|EXIT|UNDO

condition_value:

SQLSTATE[VALUE] sqlstate_value | condition_name |SQLWARNING|NOTFOUND|SQLEXCEPTION|mysql_error_code

UNDO目前MySQL不支持

1、捕获sqlstate_value

  DECLARE CONTINUE HANDLER FOR SQLSTATE ‘42S02’ SET @info=’CANNOT FIND’;

2、捕获mysql_error_code

  DECLARE CONTINUE HANDLER FOR 1146  SET @info=’CAN NOT FIND’;

3、先定义条件,然后调用

  DECLARE can_not_find CONDITION FOR 1146;

  DECLARE CONTINUE HANDLER FOR can_not_find SET @info=’CANNOT FIND’;

4、使用SQLWARNING

  DECLARE EXITHANDLER FOR SQLWARNING SET @info=’CANNOT FIND’;

5、使用NOT FOUND

  DECLARE EXIT HANDLER FOR NOT FOUND SET @info=’CANNOT FIND’;

6、使用SQLEXCEPTION

  DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info=’CANNOT FIND’;

14.1.5、光标的使用

  存储过程中对多条记录处理,使用光标

1.声明光标

DECLARE cousor_name COURSOR FOR select statement;

DECLARE  cur_employee CURSOR FOR SELECT name, age FROM employee;

2.打开光标

OPEN cursor_name;

OPEN cur_employee;

3.使用光标

FETCH cur_employee INTO var_name[,var_name…];

FETCH cur_employeeINTO emp_name, emp_age;

4.关闭光标

CLOSE cursor_name

CLOSE cur_employee

14.1.6、流程控制的使用

1.IF语句

IF search_condition THEN statement_list

         [ELSEIF search_condition THENstatement_list]…

         [ELSE statement_list]

END IF

IF age>20THEN SET @count1=@count1+1;

         ELSEIF age=20 THEN @count2=@count2+1;

         ELSE @count3=@count3+1;

END

2.CASE语句

CASE case_value

         WHEN when_value THEN statement_list

         [WHEN when_value THEN statement_list]…

         [ELSE statement_list]

END CASE

CASE

         WHEN search_condition THENstatement_list

         [WHEN search_condition THENstatement_list]…

         [ELSE statement_list]

END CASE

CASE age

         WHEN 20 THEN SET @count1=@count1+1;

         ELSE SET @count2=@count2+1;

END CASE;

CASE

         WHERE age=20 THEN SET@count1=@count1+1;

         ELSE SET @count2=@count2+1;

END CASE;

3.LOOP语句

[begin_label:]LOOP

         statement_list

ENDLOOP[end_label]

add_num:LOOP

         SET @count=@count+1;

END LOOPadd_num;

4.LEAVE语句

跳出循环控制

LEAVE label

add_num:LOOP

         SET @count=@count+1;

         LEAVE add_num;

END LOOP add_num;

5.ITERATE语句

跳出本次循环,执行下一次循环

ITERATE label

add_num:LOOP

         SET @count=@count+1;

         IF @count=100 THEN LEAVE add_num;

         ELSEIF MOD(@count,3)=0 THEN ITERATEadd_num;

         SELECT * FROM employee;

END LOOP add_num;

6.REPEAT语句

有条件循环,满足条件退出循环

[begin_label:]REPEAT

         statement_list

         UNTIL search_condition

ENDREPEAT[end_label]

REPEAT

         SET @count=@count+1;

         UNTIL @count=100;

ENDREPEAT;

7.WHILE语句

[begin_label:]WHILE search_condition DO

         statement_list

ENDREPEAT[end_label]

WHILE@count<100 DO

         SET @count=@count+1;

ENDWHILE;

14.2、调用存储过程和函数

存储过程是通过CALL语句来调用的。而存储函数的使用方法与MySQL内部函数的使用方法是一样的。执行存储过程和存储函数需要拥有EXECUTE权限。EXECUTE权限的信息存储在information_schema数据库下面的USER_PRIVILEGES表中

14.2.1、调用存储过程

CALL  sp_name([parameter[,…]]) ;

14.2.2、调用存储函数

存储函数的使用方法与MySQL内部函数的使用方法是一样的

14.3、查看存储过程和函数

SHOW { PROCEDURE| FUNCTION } STATUS [ LIKE  ' pattern ' ];

SHOW CREATE {PROCEDURE | FUNCTION } sp_name ;

SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=' sp_name ' ;

14.4、修改存储过程和函数

ALTER {PROCEDURE| FUNCTION} sp_name [characteristic ...]

characteristic:

{ CONTAINS SQL |NO SQL | READS SQL DATA | MODIFIES SQL DATA }

| SQL SECURITY {DEFINER | INVOKER }

| COMMENT'string'

14.5、删除存储过程和函数

DROP {PROCEDURE| FUNCTION } sp_name;

MySQL基础之第14章 存储过程和函数的更多相关文章

  1. MySQL基础笔记(六) 存储过程与函数

    写在开头:本文所有的示例都是基于workers表,表中保存了某公司的员工姓名.性别.工资.年龄和居住城市,如下: +----+-----------+--------+--------+------+ ...

  2. 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

    数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...

  3. mysql第五篇 : MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁

    第五篇 : MySQL 之 视图.触发器.存储过程.函数.事物与数据库锁 一.视图 视图是一个虚拟表(非真实存在的),其本质是‘根据SQL语句获取动态的数据集,并为其命名‘ ,用户使用时只需使用“名称 ...

  4. mySQL 教程 第7章 存储过程和函数

    存储过程和存储函数 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 1. MySQL存储过程和函数的区别 函数只 ...

  5. Java核心技术卷一基础知识-第14章-多线程-读书笔记

    第 14 章 多线程 本章内容: * 什么是线程 * 中断线程 * 线程状态 * 线程属性 * 同步 * 阻塞队列 * 线程安全的集合 * Collable与Future * 执行器 * 同步器 * ...

  6. mysql基础三(视图、触发器、函数、存储过程、事务、防注入)

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 1.创建视图 -格式:CREATE ...

  7. MySQL基础之第13章 MySQL函数

    13.1.数学函数 随机数可能会用到,其他基本无视. 13.2.字符串函数 重点CONCAT(S1,S2….) 13.3.日期和时间函数 一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+ ...

  8. Mysql学习笔记(十)存储过程与函数 + 知识点补充(having与where的区别)

    学习内容:存储程序与函数...这一章学的我是云里雾里的... 1.存储过程...   Mysql存储过程是从mysql 5.0开始增加的一个新功能.存储过程的优点其实有很多,不过我觉得存储过程最重要的 ...

  9. MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁

    浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视 ...

随机推荐

  1. JS中基本类型与包装类型的关系

    对于JS中一些类型的转化的东西,自己测试并得出的结论,有错误的地方请大大们留言. 不多废话,直接贴代码,测试请直接拷贝全部代码: <!DOCTYPE html> <html> ...

  2. Spark源码分析(三)-TaskScheduler创建

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3879151.html 在SparkContext创建过程中会调用createTaskScheduler函 ...

  3. java.lang.ClassCastException: sun.jdbc.odbc.JdbcOdbcStatement cannot be cast to java.beans.Statement

    当导入的包为:import java.sql.Statement;时,无任何错误 当导入的包为:import java.beans.Statement;时,出错

  4. threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证是同一个

    threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证同一个线程中是同一个共享对象. 如果是静态变量是共享的话,那必须同步,否则尽管有副本,还是会出错,故C错

  5. Haproxy均衡负载部署和配置文件详解

    HAproxy均衡负载部署和配置文件详解 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.根据官方数据,其最高极限支持10G ...

  6. iOS开发-UISlider改变图片透明度

    拖动条是通过滑块的位置来标识数值,而且拖动条允许用户拖动滑块来改变值.因此,拖动条通常用于对系统的某种数值进行调节,如调节亮度,透明度,音量等. 一.属性介绍 @property(nonatomic) ...

  7. phantomjs + selenium headless test

    1. 安装selenium pip install selenium 2. 安装phantomjs 如果你是Ubuntu12.04,默认安装的版本是1.4.这个会出错. 需要安装1.9.7 cd /u ...

  8. oracle记录解锁

    oracle 怎样查一个表中的记录是否被锁住了   怎么查询一个数据库中有几个表引用了其中某个特定表的主键做为其外键的select t.table_name from user_constraints ...

  9. MyBatis学习总结_08_Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

  10. 很赞的MathJax

    一直想在网页上放进LaTeX布局,但由于是要发布在SAE上,因此有很多的限制. 然后在这儿发现了这个好东东,MathJax,非常方便,JS直接可以外链. 通过它,我编辑了这个页面,看起来很不错哦.