博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql存储过程详细讲解及完整实例下载
阅读量:5876 次
发布时间:2019-06-19

本文共 5673 字,大约阅读时间需要 18 分钟。

一、存储过程概念
  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  过程名 ([过程参数[,...]])[特性 ...] 过程体;先看基本例子

  第一种:

delimiter ;;create procedure proc_on_insert()beginend;;delimiter

  第二种:

delimiter //create procedure proc_on_insert()beginend//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参数例子:

drop procedure if exists prc_on_in;delimiter ;;create procedure prc_on_in(in num int)begindeclare number int ;set number=num;select number;end;;delimiter ;;set @num=1;call prc_on_in(@num);

  3.2out参数创建例子

drop procedure if exists prc_on_out;delimiter ;;create procedure prc_on_out(out out_num int)beginselect out_num;set out_num=78;select out_num;end;;delimiter ;;set @number=6;call prc_on_out(@number);

  3.3inout参数创建例子

drop procedure if exists prc_on_inout;delimiter ;;create procedure prc_on_inout(inout p_inout int)beginselect p_inout;set p_inout=100;select p_inout;end;;delimiter ;;set @p_out=90;call prc_on_inout(@p_out);

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

drop procedure if exists p_else;create procedure p_else(in id int)begin    if (id > 0) then        select '> 0' as id;    elseif (id = 0) then        select '= 0' as id;    else        select '< 0' as id;    end if;end;set @p=-10;call p_else(@p);

  3.5存储过程中的case when then

drop procedure if exists p_case;delimiter ;;create procedure p_case(      id int  )  begin      case id      when 1 then         select 'one' as trans;      when 2 then      select 'two' as trans;      when 3 then       select 'three' as trans;      else      select 'no trans' as trans;      end case;  end;  ;;delimiter ;;set @id=1;call p_case(@id);

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

drop procedure if exists p_while_do;  create procedure p_while_do()  begin      declare i int;          set i = 1;          while i <= 10 do              select concat('index : ', i) ;              set i = i + 1;          end while;  end;  call p_while_do();

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

drop procedure if exists p_repeat;delimiter ;;create procedure p_repeat(in parameter int)BEGIN     declare var int;       set var = parameter;      REPEAT     set var = var - 1;      set parameter = parameter -2;      UNTIL var<0     end REPEAT;     select parameter;END;;delimiter ;; set @parameter=1;call p_repeat(@parameter);

  这个REPEAT循环的功能和前面WHILE循环一样,区别在于它的执行后检查是否满足循环条件(until i>=5),而WHILE则是执行前检查(while i<5 do)。

  不过要注意until i>=5后面不要加分号,如果加分号,就是提示语法错误。

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

    

drop procedure if exists p_loop;delimiter;;create procedure p_loop(in parameter int)BEGIN     declare var int;       set var = parameter;      LOOP_LABLE:loop     set var = var - 1;      set parameter = parameter -2;      if var<0 THEN   LEAVE LOOP_LABLE;     END IF;     end LOOP;     select parameter;END;;delimiter;;set @parameter=4;call p_loop(@parameter);

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

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

drop table if exists  person;CREATE TABLE `person` (  `id` int(11) NOT NULL DEFAULT '0',  `age` int(11) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into person(age) value(1);drop procedure if exists prc_test1;delimiter ;;create definer = root@localhost procedure prc_test1()BEGIN    declare var int;        /**跳出循环标识**/   declare done INT DEFAULT FALSE;     /**声明游标**/   declare cur cursor for select age from person;   /**循环结束设置跳出标识**/   declare continue handler for not FOUND set done = true;   /**打开游标**/   open cur;     LOOP_LABLE:loop        FETCH cur INTO var;        select var;     if done THEN   LEAVE LOOP_LABLE;     END IF;     end LOOP;     /**关闭游标**/   CLOSE cur;END;;;delimiter ;;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

转载于:https://www.cnblogs.com/sztx/p/9499759.html

你可能感兴趣的文章
Deis发布1.4版本,支持Microsoft Azure
查看>>
解读2016之Golang篇:极速提升,逐步超越
查看>>
原创:新手布局福音!微信小程序使用flex的一些基础样式属性(二)
查看>>
Swift 烧脑体操(二) - 函数的参数
查看>>
用Elm语言降低失败的风险
查看>>
荷兰商业银行使用精益领导力推行改进
查看>>
Java 10新特性前瞻
查看>>
每秒解析千兆字节的JSON解析器开源,秒杀一大波解析器!
查看>>
搜狗回应“统计加班时长裁员”;多家国产浏览器限制访问996.ICU;波音推迟737 Max软件修正丨Q新闻...
查看>>
Hazelcast发布Jet 0.6版本
查看>>
深入浅出Tensorflow(三):训练神经网络模型的常用方法
查看>>
小米大数据:借助Apache Kylin打造高效、易用的一站式OLAP解决方案
查看>>
一个小米SRE的日常问题排查记录
查看>>
多重影分身:一套代码如何生成多个小程序?
查看>>
QCon北京2016:企业级云服务技术应用与实践
查看>>
Box开源持续本土化平台Mojito
查看>>
第12次敏捷状态报告发布
查看>>
css 样式收集
查看>>
组件规范和生命周期——react文档翻译
查看>>
使用express-http-proxy解决跨域问题
查看>>