mysql存储过程详细讲解及完整实例下载
一、存储过程概念
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() begin end ;; delimiter
第二种:
delimiter // create procedure proc_on_insert() begin end // 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) begin declare number int ; set number=num; select number; end ;; delimiter ;; ; call prc_on_in(@num);
3.2out参数创建例子
drop procedure if exists prc_on_out; delimiter ;; create procedure prc_on_out(out out_num int) begin select out_num; ; select out_num; end ;; delimiter ;; ; call prc_on_out(@number);
3.3inout参数创建例子
drop procedure if exists prc_on_inout; delimiter ;; create procedure prc_on_inout(inout p_inout int) begin select p_inout; ; select p_inout; end ;; delimiter ;; ; 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 ) then select '> 0' as id; elseif (id ) then select '= 0' as id; else select '< 0' as id; end if; end; ; 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 then select 'one' as trans; then select 'two' as trans; then select 'three' as trans; else select 'no trans' as trans; end case; end; ;; delimiter ;; ; 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; ; do select concat('index : ', i) ; ; 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 ; ; UNTIL end REPEAT; select parameter; END ;; delimiter ;; ; 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 ; ; THEN LEAVE LOOP_LABLE; END IF; end LOOP; select parameter; END ;; delimiter;; ; 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` ) ', `age` ) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ); 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
mysql存储过程详细讲解及完整实例下载的更多相关文章
- Mysql事务处理详细讲解及完整实例下载
一.Mysql事务概念 MySQL 事务主要用于处理操作量大,复杂度高的数据.由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.在 MySQL 中只有使用了 Inn ...
- MySQL锁详细讲解
本文章向大家介绍MySQL锁详细讲解,包括数据库锁基本知识.表锁.表读锁.表写锁.行锁.MVCC.事务的隔离级别.悲观锁.乐观锁.间隙锁GAP.死锁等等,需要的朋友可以参考一下 锁的相关知识又跟存 ...
- mysql存储过程详细教程
记录mysql存储过程中的关键语法:DELIMITER // 声明语句结束符,用于区分;CREATE PROCEDURE demo_in_parameter(IN p_in int) 声明存储过程 ...
- linux上搭建nginx+php+mysql环境详细讲解
1.mysql安装 #安装编译环境 yum install -y gcc gcc-c++ gcc-devel g++ g++-devel; yum install -y wget yum instal ...
- JsTree 最详细教程及完整实例
JsTree是一个jquery的插件,它提交一个非常友好并且强大的交互性的树,并且是完全免费或开源的(MIT 许可).Jstree技持Html 或 json格式的的数据, 或者是ajax方式的动态请求 ...
- MySQL的详细讲解
目录 Mysql的架构与历史 MySQL的逻辑架构 更新中---- Mysql的架构与历史 MySQL的逻辑架构 第二层的架构是所有的跨引擎的功能实现的地方,例如:存储,触发器,视图等. 第三层半酣了 ...
- MySQL MEM_ROOT详细讲解
这篇文章会详细解说MySQL中使用非常广泛的MEM_ROOT的结构体,同时省去debug部分的信息,仅分析正常情况下,mysql中使用MEM_ROOT来做内存分配的部分. 在具体分析之前我们先例举在该 ...
- mysql存储过程 详细注释
原文:https://my.oschina.net/u/3582142/blog/1581929
- mysql用sql创建表完整实例
create table user_login_latest( id int(11) unsigned NOT NULL AUTO_INCREMENT, user_id int(11) not nul ...
随机推荐
- 【Android Developers Training】 106. 创建并检测地理围栏
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- (cljs/run-at (JSVM. :all) "一起实现柯里化")
前言 习惯了Ramda.js就会潜意识地认为函数均已柯里化,然后就可以随心所欲的用函数生成函数,或者使用compose组合多个函数来生成一个新函数.如下 const f = a => b =& ...
- [Android FrameWork 6.0源码学习] ViewGroup的addView函数分析
Android中整个的View的组装是采用组合模式. ViewGroup就相当与树根,各种Layout就相当于枝干,各种子View,就相当于树叶. 至于View类.我们就当它是个种子吧.哈哈! Vie ...
- Web自动化之Headless Chrome编码实战
API 概览 && 编码Tips 文档地址 github Chrome DevTools Protocol 协议本身的仓库 有问题可以在这里提issue github debugger ...
- 防止js全局变量污染方法总结
javaScript 可以随意定义保存所有应用资源的全局变量.但全局变量可以削弱程序灵活性,增大了模块之间的耦合性.在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题 ...
- java 文件的编码 问题
package com.io; public class Encodedemo { public static void main(String[] args)throws Exception{ // ...
- Unreal Engine 4 Radiant UI 入门教程(零)在场景中摆放网页
相关的学习资源: https://forums.unrealengine.com/showthread.php?12097-PLUGIN-RadiantUI-SDK-UIs-HUDs-Interact ...
- 集群之mysql主从配置(windows和linux版)
起因 由于网站进一步开发运行的需求,要求主机7*24小时运行正常,同时要求能够防止数据库灾难.考虑到后期的开发程度和业务量,准备向高可用系统进行改变,同时通过负载均衡提高网络性能.于是第一步就考虑到了 ...
- CSS3文本
1.文字省略 text-overflow:ellipsis; overflow:hidden; white-space:nowrap; //text-overflow(clip.ellipsis)只是 ...
- 1、微信小程序----弹幕的实现(无后台)
小程序刚刚出来,现在网上的demo是多,但是要找到一个自己需要的却不容易.今天跟大家分享自己写的一个弹幕功能. 先来一张效果图: 我的思路是这样的,先用<switch>标签确定是否打开弹幕 ...