MySQL由浅入深探究存储过程

目录
  • 什么是存储过程
  • 存储过程和存储函数的区别
    • 优点
    • 缺点
  • 存储过程的创建和调用
  • 带in参数模式的存储过程
  • out参数模式的存储过程
  • inout参数模式存储过程和删除查看存储过程

什么是存储过程

存储过程(Stored Procedure)也成为存储程序,是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。即预先编辑好SQL语句的集合,这个集合完成了某项具体的功能集合,需要这个功能的时候,只要调用这个过程就好。在业务开发工过程中,一般不要求使用存储过程实现业务流程,编写的存储过程不方便调试和扩展,同时没有移植性。

简单来说存储过程就是具有名字的一段代码,用来完成一个特定的功能。他和函数很像,但是他不是函数,

MySQL 5.0 版本开始支持存储过程。

存储过程和存储函数的区别

存储函数的限制比较多,例如不能用临时表,只能用表变量,而存储过程的限制较少,存储过程的实现功能要复杂些,而函数的实现功能针对性比较强。

返回值不同。存储函数必须有返回值,且仅返回一个结果值;存储过程可以没有返回值,但是能返回结果集(out,inout)。

调用时的不同。存储函数嵌入在SQL中使用,可以在select 存储函数名(变量值);存储过程通过call语句调用 call 存储过程名。

参数的不同。存储函数的参数类型类似于IN参数,没有类似于OUT和INOUT的参数。存储过程的参数类型有三种,in、out和inout:

  • in:数据只是从外部传入内部使用(值传递),可以是数值也可以是变量
  • out:只允许过程内部使用(不用外部数据),给外部使用的(引用传递:外部的数据会被先清空才会进入到内部),只能是变量
  • inout:外部可以在内部使用,内部修改的也可以给外部使用,典型的引用 传递,只能传递变量。

优点

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
  • 存储过程可以用在数据检验,强制实行商业逻辑等。

缺点

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  • 存储过程的性能调校与撰写,受限于各种数据库系统。

存储过程的创建和调用

创建的存储过程保存在数据库的数据字典中。

创建语法:

create procedure 存储过程的名字(参数列表)
begin
存储过程体(SQL语句的集合);
end

注意:

①参数列表包含三个部分:

参数模式    参数名    参数类型

(比如: in s_name varchar(20) )

声明存储过程:

CREATE PROCEDURE demo_in_parameter(IN s_name varchar(20))

参数模式:

in : 该参数可以作为输入,需要调用方传入值来给存储过程

out : 该参数可以作为输出,该参数可以作为返回值给调用方

inout : 该参数既可以做输入,也可以作为输出

存储过程开始和结束符号:

BEGIN .... END

②如果存储体只要一句SQL语句,begin和end可以省略,存储体里的sql语句结尾处必须加分号,避免数据库误判为存储过程的结束标记,所以需要我们自定义命令的结尾符号:

delimiter 结尾标记 比如:

delimiter $

如果没有下面用表,先创建

drop table ages;
drop table students;
create table ages(id int,age int);
create table students(id int,name varchar(4),ta_id int);
insert into ages(id,age) values(1,12);
insert into ages(id,age) values(2,22);
insert into ages(id,age) values(3,32);
insert into ages(id,age) values(4,42);
insert into ages(id,age) values(5,52);
insert into ages(id,age) values(6,62);
insert into students(id,name,ta_id) values(1,'任波涛',2);
insert into students(id,name,ta_id) values(2,'田兴伟',1);
insert into students(id,name,ta_id) values(3,'唐崇俊',3);
insert into students(id,name,ta_id) values(4,'夏铭睿',8);
insert into students(id,name,ta_id) values(5,'包琪',1);
insert into students(id,name,ta_id) values(6,'夏雨',10);
insert into students(id,name,ta_id) values(7,'夏铭雨',10);
insert into students(id,name,ta_id) values(8,'白芳芳',6);

无参数存储过程:

delimiter $		#将语句的结束符号从分号;临时改为两个$(可以是自定义)
create procedure myp1()
begin
insert into ages(id,`age`) values (11,'12');
insert into ages(id,`age`) values (21,'13');
insert into ages(id,`age`) values (31,'14');
insert into ages(id,`age`) values (41,'15');
end $
delimiter ;		#将语句的结束符号恢复为分号

存储过程的调用:

call 存储过程名(参数列表);

调用:

call myp1();

带in参数模式的存储过程

案例:通过学生名查询对应的年龄

delimiter $
create procedure myp2(in s_name varchar(10))
begin
select s.name, a.age from students s
inner join ages a
on s.ta_id = a.id
where s.name=s_name;
end $

调用:call myp2(‘任波涛’) $

out参数模式的存储过程

案例:根据学生姓名,返回对应的年龄

create procedure myp3(in sname varchar(10),out age int)
begin
select a.age into age
from students s
inner join ages a
on s.ta_id = a.id
where s.name=sname;
end $

调用:

call myp3(‘任波涛’,@age) $ #把值取出来放到变量里去

select @age $ #查看值了

案例:根据学生姓名,返回对应的年龄和学生编号

create procedure myp4(in sname varchar(10),out age int,out sid int)
begin
select a.age ,s.id into age,sid
from students s
inner join ages a
on s.ta_id = a.id
where s.name=sname;
end $

调用:

call myp4(‘任波涛’,@age,@sid) $

select @age,@sid $

inout参数模式存储过程和删除查看存储过程

案例:传入a和b两个数,然后让a和b都乘以2后返回

create procedure myp5(inout a int , inout b int)
begin
set a=a*2;
set b=b*2;
end $

调用:

set @a=10$
set @b=20$
call myp5(@a,@b)$
select @a,@b $
delimiter ;

#查看存储过程

show procedure status like 'myp%';

删除存储过程:

drop procedure 存储过程名;
drop procedure myp1; #每次只能删除一个

查看存储过程的信息:

show create procedure 存储名;
show create procedure myp1;

到此这篇关于MySQL由浅入深探究存储过程的文章就介绍到这了,更多相关MySQL存储过程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL一次性创建表格存储过程实战

    目录 一.创建表格 二.补充:MySQL的存储函数与存储过程的区别 一.创建表格 创建下个月的每天对应的表user_2022_01_01.... 需求描述: 我们需要用某个表记录很多数据,比如记录某某用户的搜索.购买行为(注意,此处是假设用数据库保存),当每天记录较多时,如果把所有数据都记录到一张表中太庞大,需要分表,我们的要求是,每天一张表,存当天的统计数据,就要求提前生产这些表——每月月底创建下一个月每天的表! PREPARE stmt_name FROM preparable_stmt E

  • MySQL的存储函数与存储过程的区别解析

    MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数. 存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合. 存储函数与存储过程的区别 1.存储函数有且只有一个返回值,而存储过程可以有多个返回值,也可以没有返回值. 2.存储函数只能有输入参数,而且不能带in, 而存储过程可以有多个in,out,inout参数. 3.存储过程中的语句功能更强大,存储过程可以实现很复杂的业务逻辑,而函数有很多限制,如不能在函数中使用insert,

  • MySQL中存储过程的详细详解

    目录 概述 优点 缺点 MySQL存储过程的定义 存储过程的基本语句格式 存储过程的使用 定义一个存储过程 定义一个有参数的存储过程 定义一个流程控制语句 IF ELSE 定义一个条件控制语句 CASE 定义一个循环语句 WHILE 定义一个循环语句 REPEAT UNTLL 定义一个循环语句 LOOP 使用存储过程插入信息 存储过程的管理 显示存储过程 显示特定数据库的存储过程 显示特定模式的存储过程 显示存储过程的源码 删除存储过程 后端调用存储过程的实现 总结 概述 由MySQL5.0 版

  • MySQL存储过程图文实例讲解

    目录 MySQL的存储过程 MySQL存储过程的创建 1.简单实例 2.通过游标遍历结果集 总结 MySQL的存储过程 存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性. MySQL存储过程的创建 语法 CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参

  • MySql存储过程和游标的使用实例

    目录 前言 1.创建存储过程. 2.查看存储过程名称 3.调用存储过程 4.删除存储过程 总结 前言 这里存储过程和游标的定义和作用就不介绍了,网上挺多的,只通过简单的介绍,然后用个案例让大家快速了解.实例中会具体说明变量的定义,赋值,游标的使用,控制语句,循环语句的介绍. 1.创建存储过程. CREATE PROCEDURE myproc(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM students; END 存储过程根据需要可能会有输入.输出.输

  • 彻底搞懂MySQL存储过程和函数

    目录 1.0  创建存储过程和函数 1. 创建存储过程 2. 创建存储函数 2|0变量 1. 定义变量 2. 变量赋值 3|0定义条件和处理程序 1. 定义条件 2. 定义处理程序 4|0光标 1. 声明光标 2. 打开光标 3. 使用光标 4. 关闭光标 5|0流程控制 1. IF 语句 2. CASE 语句 3. LOOP 语句 4. LEAVE 语句 5. ITERATE 语句 6. REPEAT 语句 7. WHILE 语句 6|0操作存储过程和函数 1. 调用存储过程 2. 调用存储函

  • MySQL数据库实验之 触发器和存储过程

    目录 一.实验目的 二.实验要求 三.实现内容及步骤 1.创建一个不带参数的简单存储过程 2.创建一个带输入参数的存储过程 3.创建一个带输入输出参数的存储过程 4.触发器的创建与使用 四.实验总结 观前提示:本篇内容为mysql数据库实验,代码内容经测试过,可能一小部分有所疏漏,也有会不符合每个人实验的要求的地方,因此以下内容建议仅做思路参考. 一.实验目的 1.掌握某主流DBMS支持的SQL编程语言和编程规范,规范设计存储过程: 2.能够理解不同类型触发器的作用和执行原理,验证触发器的有效性

  • MySql存储过程循环的使用分析详解

    目录 简介 场景描述 解决方案 案例 总结 简介 每一门数据库语言语法都基本相似,但是对于他们各自的一些特性(函数.存储过程等)的用法就不大相同了,就好比Oracle与Mysql存储过程写起来就很多不同的地方,在这里主要是跟大家分享一下MySql存储过程中使用游标循环的处理方法. 场景描述 我们举一个简单的场景,首先我们可能会有这样一种情况,考试成绩表(t_achievement)有一堆的sql脚本处理,需要依赖另一个学生表(t_student)数据对部分学生做考试成绩汇总记录到成绩汇总表(t_

  • MySQL存储过程的概念与用法实例

    目录 概念 特性 存储过程通常有以下优点 格式 创建存储过程 定义变量 局部变量 用户变量 系统变量 存储过程 存储过程传参-in 存储过程传参-out 存储过程传参-inout 流程控制 流程控制-判断 流程控制语句-case 控制流程-循环 while循环 repeat循环 loop循环 游标 异常处理-HANDLER句柄 总结 概念 MySQL5.0版本开始支持存储过程,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法,存储过就是数据库SQ

  • MySQL由浅入深探究存储过程

    目录 什么是存储过程 存储过程和存储函数的区别 优点 缺点 存储过程的创建和调用 带in参数模式的存储过程 out参数模式的存储过程 inout参数模式存储过程和删除查看存储过程 什么是存储过程 存储过程(Stored Procedure)也成为存储程序,是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象.即预先编辑好SQL语句的集合,这个集合完成了某项具体的功能集合,需要这个功能的时候,只要调用这个过程就好.在业务开发工过程中,一般不要求使用存储过程实现业务流程,编写的存储过程不方

  • MySQL实现创建存储过程并循环添加记录的方法

    本文实例讲述了MySQL实现创建存储过程并循环添加记录的方法.分享给大家供大家参考,具体如下: 先创建,然后调用: -- 创建存储过程 DELIMITER;// create procedure myproc() begin declare num int; set num=1; while num <= 24 do insert into t_calendar_hour(hourlist) values(num); set num=num+1; end while; commit; end;/

  • Mysql中调试存储过程最简单的方法

    以前同事告诉我用临时表插入变量数据来查看,但是这种方法过于麻烦,而且Mysql没有比较好的调试存储过程的工具.今天google了下发现可以用select + 变量名的方法来调试 具体方法: 在你的存储过程中加入如下语句: SELECT 变量1,变量2; 然后用mysql自带的cmd程序进入mysql> 下. call 你的存储过程名(输入参数1,@输出参数);(注:这里帮助下新同学,如果你的存储过程有输出变量,那么在这里只需要加 @ 然后跟任意变量名即可); 即可发现你的变量值被打印到了cmd下

  • MySQL如何利用存储过程快速生成100万条数据详解

    1.在测试的时候为了测试大数据量的情况下项目的抗压能力我们通常要创造一些测试数据那么现在这个方法绝对好用 其中可能会有sql空间的报错可以自己尝试解决,这里做了分批插入,每次插入30万条,所以没有遇到类似的空间问题 首先,创建要插入100万数据的表格 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for sdb_b2c_orders -- ----

  • MySQL通过函数存储过程批量插入数据

    目录 数据库 mysql批量插入数据函数存储过程 附:MySQL通过函数批量插入数据 总结 数据库 mysql批量插入数据函数存储过程 -- 1 批量插入数据 -- 1.1 创建表 CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL, `address` VARCHAR(40) DEFAULT NULL, ceo INT NULL , PRIMARY KEY

  • MySQL由浅入深掌握连接查询

    目录 内连接 自然连接和等值连接的区别 内连接的实现方式 外连接 左连接 右连接 全连接 数据库版本:mysql8.0.27 内连接 内连接INNERJOIN是最常用的连接操作.从数学的角度讲就是求两个表的交集,从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录. 在我看来内连接和等值连接差不多,自然连接是内连接中的一个特殊连接 自然连接和等值连接的区别 什么是自然连接? 自然连接(Naturaljoin)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结

  • 详解MySQL中的存储过程和函数

    目录 区别 优点 创建储存函数和过程 储存过程 储存函数 查看储存过程 操作 变量 赋值 变量例子 定义条件和处理过程 条件 处理程序 游标 流程控制语句 储存过程和函数就是数据器将一些处理封装起来,调用 区别 调用储存过程只需要使用CALL,然后指定储存名称和参数,参数可以是IN.OUT和INOUT 调用储存函数只需要使用SELECT,指定名称和参数,储存函数必须有返回值,参数只能是IN 优点 良好的封装性 应用程序和SQL逻辑分离 让SQL也具有处理能力 减少网络交互 能够提高系统性能 降低

  • MySQL函数与存储过程字符串长度限制的解决

    目录 问题描述 原因分析: 解决方案: 问题描述 MySQL函数或者存储过程中使用group_concat()函数导致数据字符过长而报错 CREATE DEFINER=`root`@`%` PROCEDURE `get_pipe_child`(IN `in_pipe2Num` varchar(25),IN `in_sectionNum` varchar(5)) BEGIN  declare ids varchar(1000) default '';   declare tempids varch

  • 实例解析MySQL中的存储过程及存储过程的调用方法

    mysql在5.1之后增加了存储过程的功能, 存储过程运行在mysql内部,语句都已经编译好了,速度比sql更快. 存储过程与mysql相当于shell和linux系统.如果你是程序员的话,那我告诉你存储过程实际上是一个方法,你只要调用这个方法,并且输入它设置好的参数就可以获取或者执行你想要的操作了. 看了如下存储过程实例,你会发现mysql存储过程和shell很像. 下面存储过程内容为:调用存储过程,并且传入用户名,密码参数.存储过程会将这她们存储到process_test表里面.看实例 一,

  • mysql 让一个存储过程定时作业的代码

    1.在mysql 中建立一个数据库 test1 语句:create database test1 2.创建表examinfo create table examinfo( id int auto_increment not null, endtime datetime, primary key(id) ); 3 插入数据: insert into examinfo values('1','2011-4-23 23:26:50'); 4 创建存储过程test CREATE PROCEDURE te

随机推荐