一、存储过程概念
  1.存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集。经编译后存储在数据库 中。
  2.存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过 程带有参数)来执行它。
  3.存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中。
  4.存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。
  5.同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
二、存储过程优点
  1.增强了SQL语句的功能和灵活性
  2不需要反复建立一系列处理步骤,保证了数据的完整性
  3.降低了网络的通信量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语 句相比自然数据量少了很多
  4.增强了使用的安全性,通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而 保证数据的安全。
  5.可以实现集中控制,当规则发生改变时,只需要修改存储过程就可以。。、
三、存储过程缺点
  1.调试不是很方便。
  2.可能没有创建存储过程的权利。
  3.重新编译问题。
  4.移植性问题。

四、变量

  1.用户变量:以”@”开始,形式为”@变量名。” 用户变量跟MySQL客户端是绑定的,设置的变量,只对当前用户使用的客户端生效.
  2.全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名 或者 set @@global.变量名。show global variables; 对所有客户端生效。只有super权限才可以设置全局变量。
  3.会话变量:只对连接的客户端有效。一旦客户端失去连接,变量失效。show session variables;
  4.局部变量:作用范围在begin到end语句块之间。

    4.1在该语句块里设置的变量declare语句专门用于定义局部变量。declare numeric number(8,2)【MySQL的数据类型,如:int,float, date, varchar(length)】 default 9.95;

    4.2变量赋值:SET 变量名 = 表达式值 [,variable_name= expression ...],set numeric=1.2或者SELECT 2.3 into @x;

五、mysql 存储程序

  1.基本语法:create procedure  过程名 ([过程参数[,...]])[特性 ...] 过程体;先看基本例子

  第一种:

  1. delimiter ;;
  2. create procedure proc_on_insert()
  3. begin
  4. end
  5. ;;
  6. delimiter

  第二种:

  1. delimiter //
  2. create procedure proc_on_insert()
  3. begin
  4. end
  5. //
  6. delimiter ;;

  注意:

  1).这里需要注意的是delimiter // 和delimiter ;;两句,delimiter是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用delimiter关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码。
  2).存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
  3).过程体的开始与结束使用begin与emd进行标识。

  2..调用存储过程基本语法:call sp_name()

  3.参数:MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

    create procedure([[in |out |inout ] 参数名 数据类形...])
    in输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
    out 输出参数:该值可在存储过程内部被改变,并可返回
    inout 输入输出参数:调用时指定,并且可被改变和返回

    3.1in参数例子:

  1. drop procedure if exists prc_on_in;
  2. delimiter ;;
  3. create procedure prc_on_in(in num int)
  4. begin
  5. declare number int ;
  6. set number=num;
  7. select number;
  8. end
  9. ;;
  10. delimiter ;;
  11. ;
  12. call prc_on_in(@num);

  3.2out参数创建例子

  1. drop procedure if exists prc_on_out;
  2. delimiter ;;
  3. create procedure prc_on_out(out out_num int)
  4. begin
  5. select out_num;
  6. ;
  7. select out_num;
  8. end
  9. ;;
  10. delimiter ;;
  11. ;
  12. call prc_on_out(@number);

  3.3inout参数创建例子

  1. drop procedure if exists prc_on_inout;
  2. delimiter ;;
  3. create procedure prc_on_inout(inout p_inout int)
  4. begin
  5. select p_inout;
  6. ;
  7. select p_inout;
  8. end
  9. ;;
  10. delimiter ;;
  11. ;
  12. call prc_on_inout(@p_out);

  3.4存储过程中的IF语句(if then elseif then else end if)

  1. drop procedure if exists p_else;
  2. create procedure p_else(in id int)
  3. begin
  4. ) then
  5. select '> 0' as id;
  6. elseif (id ) then
  7. select '= 0' as id;
  8. else
  9. select '< 0' as id;
  10. end if;
  11. end;
  12. ;
  13. call p_else(@p);

  3.5存储过程中的case when then

  1. drop procedure if exists p_case;
  2. delimiter ;;
  3. create procedure p_case(
  4. id int
  5. )
  6. begin
  7. case id
  8. then
  9. select 'one' as trans;
  10. then
  11. select 'two' as trans;
  12. then
  13. select 'three' as trans;
  14. else
  15. select 'no trans' as trans;
  16. end case;
  17. end;
  18. ;;
  19. delimiter ;;
  20. ;
  21. call p_case(@id);

  3.6存储过程中的while do … end while语句

  1. drop procedure if exists p_while_do;
  2. create procedure p_while_do()
  3. begin
  4. declare i int;
  5. ;
  6. do
  7. select concat('index : ', i) ;
  8. ;
  9. end while;
  10. end;
  11. call p_while_do();

  3.7存储过程中的repeat … until end repeat语句

  1. drop procedure if exists p_repeat;
  2. delimiter ;;
  3. create procedure p_repeat(in parameter int)
  4. BEGIN
  5. declare var int;
  6. set var = parameter;
  7. REPEAT
  8. ;
  9. ;
  10. UNTIL
  11. end REPEAT;
  12. select parameter;
  13. END
  14. ;;
  15. delimiter ;;
  16. ;
  17. call p_repeat(@parameter);

  这个REPEAT循环的功能和前面WHILE循环一样,区别在于它的执行后检查是否满足循环条件(until i>=5),而WHILE则是执行前检查(while i<5 do)。
  不过要注意until i>=5后面不要加分号,如果加分号,就是提示语法错误。

3.8存储过程中的loop ··· end loop语句

    

  1. drop procedure if exists p_loop;
  2. delimiter;;
  3. create procedure p_loop(in parameter int)
  4. BEGIN
  5. declare var int;
  6. set var = parameter;
  7. LOOP_LABLE:loop
  8. ;
  9. ;
  10. THEN
  11. LEAVE LOOP_LABLE;
  12. END IF;
  13. end LOOP;
  14. select parameter;
  15. END
  16. ;;
  17. delimiter;;
  18. ;
  19. call p_loop(@parameter);

    使用LOOP编写同样的循环控制语句要比使用while和repeat编写的要复杂一些:在循环内部加入了IF……END IF语句,在IF语句中又加入了LEAVE语句,LEAVE语句的意思是离开循环,LEAVE的格式是:LEAVE 循环标号。

  4.游标的使用 :定义游标 ,打开游标 ,使用游标 ,关闭游标例子

  1. drop table if exists person;
  2. CREATE TABLE `person` (
  3. `id` ) ',
  4. `age` ) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  7. );
  8. drop procedure if exists prc_test1;
  9. delimiter ;;
  10. create definer = root@localhost procedure prc_test1()
  11. BEGIN
  12. declare var int;
  13. /**跳出循环标识**/
  14. declare done INT DEFAULT FALSE;
  15. /**声明游标**/
  16. declare cur cursor for select age from person;
  17. /**循环结束设置跳出标识**/
  18. declare continue handler for not FOUND set done = true;
  19. /**打开游标**/
  20. open cur;
  21. LOOP_LABLE:loop
  22. FETCH cur INTO var;
  23. select var;
  24. if done THEN
  25. LEAVE LOOP_LABLE;
  26. END IF;
  27. end LOOP;
  28. /**关闭游标**/
  29. CLOSE cur;
  30. END;
  31. ;;
  32. delimiter ;;
  33. call prc_test1();

5.MySQL存储过程的查询

5.1.查看某个数据库下面的存储过程

select name from mysql.proc where db=’数据库名’;
或者
select routine_name frominformation_schema.routines where routine_schema='数据库名';
或者
show procedure status where db='数据库名';

5.2.查看存储过程的详细

show create procedure 数据库.存储过程名;

6、MySQL存储过程的修改

ALTER PROCEDURE:更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。

7.删除存储过程
drop procedure sp_name //注释函数名

mysql存储函数实例下载地址:http://pan.baidu.com/s/1gf1Swk7        密码:282i

mysql存储过程详细讲解及完整实例下载的更多相关文章

  1. Mysql事务处理详细讲解及完整实例下载

    一.Mysql事务概念 MySQL 事务主要用于处理操作量大,复杂度高的数据.由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.在 MySQL 中只有使用了 Inn ...

  2. MySQL锁详细讲解

    本文章向大家介绍MySQL锁详细讲解,包括数据库锁基本知识.表锁.表读锁.表写锁.行锁.MVCC.事务的隔离级别.悲观锁.乐观锁.间隙锁GAP.死锁等等,需要的朋友可以参考一下   锁的相关知识又跟存 ...

  3. mysql存储过程详细教程

    记录mysql存储过程中的关键语法:DELIMITER //  声明语句结束符,用于区分;CREATE PROCEDURE demo_in_parameter(IN p_in int)  声明存储过程 ...

  4. linux上搭建nginx+php+mysql环境详细讲解

    1.mysql安装 #安装编译环境 yum install -y gcc gcc-c++ gcc-devel g++ g++-devel; yum install -y wget yum instal ...

  5. JsTree 最详细教程及完整实例

    JsTree是一个jquery的插件,它提交一个非常友好并且强大的交互性的树,并且是完全免费或开源的(MIT 许可).Jstree技持Html 或 json格式的的数据, 或者是ajax方式的动态请求 ...

  6. MySQL的详细讲解

    目录 Mysql的架构与历史 MySQL的逻辑架构 更新中---- Mysql的架构与历史 MySQL的逻辑架构 第二层的架构是所有的跨引擎的功能实现的地方,例如:存储,触发器,视图等. 第三层半酣了 ...

  7. MySQL MEM_ROOT详细讲解

    这篇文章会详细解说MySQL中使用非常广泛的MEM_ROOT的结构体,同时省去debug部分的信息,仅分析正常情况下,mysql中使用MEM_ROOT来做内存分配的部分. 在具体分析之前我们先例举在该 ...

  8. mysql存储过程 详细注释

    原文:https://my.oschina.net/u/3582142/blog/1581929

  9. mysql用sql创建表完整实例

    create table user_login_latest( id int(11) unsigned NOT NULL AUTO_INCREMENT, user_id int(11) not nul ...

随机推荐

  1. linux统计cdn日志慢请求

    ./stat_ip.sh live-https.log-0510.gz 1000 #首先用shell脚本可以统计出?日志慢请求查询时间超过?秒对应的ip和对应的调用次数(传两个参数) #!/bin/b ...

  2. axis1.4开发webservice服务端(快速入门)-基于jdk1.4

    写在前面: 现在有很多开发webservice的方法以及框架,什么cxf等,但是这些在你编写服务类的时候都要用到注解这个功能.如果现在的jdk是1.4的,那么就不能使用注解这个功能了.所以这里可以用到 ...

  3. java excel导出

    下面是jsp代码: <li class="btns"><input id="btnExport" class="btn btn-pr ...

  4. 修改MySQL数据库密码

    在mysql数据库里面有一个默认安装的数据库是mysql,里面有一个user表.里面的字段Host是运行登录的ip地址,User 是登录的账号Password是密码. use mysql;//使用my ...

  5. 快速学习springMVC框架原理

    一.通过导图的方法快速去理解springmvc的原理 二.架构流程. 1. 用户发送请求至前端控制器DispatcherServlet 2. DispatcherServlet收到请求调用Handle ...

  6. Docker快速入门

    Docker已经火了很长一段时间,最近打算在阿里云上好好熟悉一下Docker的相关应用,为今后的工作做准备. 基本概念 Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是do ...

  7. Java之面向对象例子(一)

    定义一个人类,给这个类定义一个从身份证获取生日的方法,输入身份证,获取出生年月日 //主方法 package com.hanqi.maya.model; import java.util.Scanne ...

  8. 为何你跟着滴滴D8级前端大神撸代码,技术却依旧原地踏步?

    引子 听说最近有很多小伙伴,热衷于在慕课网上学习各种前端实战教程,并以完成项目为奋斗目标.比如本文接下来要提到的<Vue2.0高级实战之开发移动端音乐App>,这门课程的传授者是来自滴滴D ...

  9. 如何给Ionic写一个cordova插件

    写一个cordova插件 之前由javaWeb转html5开发,由于面临新技术,遂在适应的过程中极为挣扎,不过还好~,这个过程也极为短暂:现如今面临一些较为复杂的需求还会有一丝丝头痛,却没有一开始那么 ...

  10. js模块加载详解

    看着java中各种import加载,在回过头来看看javascript还在自己造轮子,写各种XX的模块加载框架,ECMASCRIPT6不知什么时候能够普及.不过DT归DT,该学的还是要学. 一 同步加 ...