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

一.对待存储过程和函数的态度

在实际项目中应该尽量少用存储过程和函数,理由如下:

1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了。

2.调试麻烦,在db中报一个错误和在应用层报一个错误不是一个概念,那将是毁灭性打击,直接一个error:1045什么的更本毫无头绪。

3.扩展性不高

所以在互联网时代大型项目应该尽量少使用(不使用)存储过程和函数。

二.创建存储过程

2.1什么是存储过程?

存储过程和存储函数都是一组sql语句的集合。这些语句集合被当做一个整体存入数据库中。

2.2创建存储过程的语法:

create procedure 存储过程名(参数列表)

                    sql语句

例子:

delimiter //
create procedure pro()
reads sql data
begin
select * from stu;
end
//

那么我们现在就有一个存储过程pro了,但是这个存储过程他是没有参数的,他只是执行一次查询操作。

我们现在来讲解一下这个存储过程的结构:

delimiter //  是将分号转化为//   因为在sql执行时当他遇到分号 ; 时他就讲停止所以我们必须将其转化为 //直到最后一行才会停止执行。

reads sql  data   解释characteristic的状态在这里是只读模式,其他的模式还有:no sql 没有sql语句 , ins  sql 不包含读和写的语句 , modifies sql data   包含写入数据的语句等等。

begin /***/  end   在存储过程中当有多条语句集合时我们必须使用begin和end

//   结束整个存储过程

2.3使用存储过程

在只是创建了一个存储过程,那么我们怎么来使用这个存储过程呢?

语法:call  存储过程名()

将上一个存储过程pro使用的例子:

call pro();

2.4创建一个带参数的存储过程

参数列表:存储过程的参数有三种类型:in,out,inout 分别表示传入参数和传出参数,和即传入也传出参数。

例子:首先我们来创建两张表:课程表是学生表的从表

create table stu(
stu_id bigint primary key auto_increment,#学号
stu_name varchar(10) not null,#姓名
stu_major int not null,#专业号
stu_sex char,#性别
stu_in date,#入学日期
stu_birth date,#出生日期
foreign key (stu_major) references major(ma_id)#专业外键设置
);
create table major(
ma_id int primary key,
ma_name varchar(15),
ma_boss varchar(10)
);
insert into major values(1,"信管","张三");
insert into major values(2,"电子商务","李四");
insert into stu values(1,"小明",1,"男","2017-09-01","1998-12-23");
insert into stu values(2,"小高",1,"男","2017-09-01","1998-05-01");
insert into stu values(3,"小李",2,"男","2017-09-01","1999-04-01");
 

我们再来创建一个带有参数的存储过程找到学生的主修课的名字,代码如下:

delimiter //
create procedure pro1(in sname varchar(10),out ma varchar(10))
reads sql data
begin
select ma_name into ma from major where ma_id = (select stu_major from stu where stu_name=sname);
end
//

使用这个存储过程:代码如下:

set @ma="没查询之前";
call pro1("小李",@ma);
select @ma;

结果如下:

解释一下代码:首先使用set @ma 定义一个全局变量,然后在使用call 存储过程名 语法调用存储过程,同时全局变量ma的值也改变了。

三.创建一个存储函数

3.1存储过程和存储函数的不同。

1.在函数中必须要有return返回值

2.在存储过程中参数有in  out   inout三种,默认为in类型,但是在函数中只有一种in类型。

3.2创建一个函数

语法:create  function 函数名()

         return 返回类型

          sql语句集合

例子:

delimiter //
create function fun1(num int)
returns int
begin
return num+1000;
end
//

显然函数与存储过程的最大的区别就是在于return

3.3调用函数

使用语法不在使用关键字call,而是关键字select ,select  函数名

例子:

select fun1(100);

结果:

四.删除存储函数和存储过程

语法:drop   procedure  |   function  存储过程名或者是函数名

 例子:

drop procedure pro;

注意他是不带括号的

五.在存储过程和存储函数中使用游标

5.1为什么需要游标?

当我们在使用存储过程的时候可能用到多条数据,那么我们就需要用到游标来存放多条数据。

5.2使用游标的注意点

游标不能单独存在,必须在存储过程或者是存储函数中使用。

5.3使用游标

语法:

1.创建游标:declare  游标名  cursor  for  select语句  

2.打开游标:open  游标名

3.使用游标:fetch  游标名  into  变量名

4.关闭光标:close 游标名

5.4例子

delimiter //
create function fun3(id int)
returns int
reads sql data
begin
declare cur cursor for select stu_id from stu;
open cur;
fetch cur into id;
close cur;
return id;
end
//

使用

set @id=0;
select fun3(@id);

结果

可以发现游标只是将第一个值给了变量。

原文地址:https://www.cnblogs.com/SAM-CJM/p/9711458.html

时间: 2024-10-05 17:39:38

MySQL中的存储过程和函数使用详解的相关文章

查询MySQL中的存储过程和函数

select name from mysql.proc where db = '' and `type` = 'PROCEDURE' //查询存储过程 select name from mysql.proc where db = '' and `type` = 'FUNCTION' //查询函数 select name,body_utf8 from mysql.proc where db = '' and `type` = 'PROCEDURE' and name='';

MySQL中的show variables like xxx 详解

1, 查看MySQL服务器配置信息 mysql> show variables; 2, 查看MySQL服务器运行的各种状态值 mysql> show global status; 3, 慢查询 1. mysql> show variables like '%slow%'; 2. +------------------+-------+ 3. | Variable_name | Value | 4. +------------------+-------+ 5. | log_slow_qu

R语言笔记 R中设置图形参数--函数par()详解

R有着非常强大的绘图功能,我们可以利用简单的几行代码绘制出各种图形来,但是有时候默认的图形设置没法满足我们的需要,甚至会碰到各种各样的小问题:如坐标轴或者标题出界了,或者图例说明的大小或者位置遮挡住了图形,甚至有时候默认的颜色也不能满足我们的需求.如何进行调整呢?这就用到了"强大"的函数par().我们可以通过设定函数par()的各个参数来调整我们的图形,这篇博文就是对函数par()的各个参数进行一下总结. 函数par()的使用格式如下: par(..., no.readonly =

mysql导入数据库中的存储过程和函数出现错误的解决办法

mysql导入数据库中的存储过程和函数出现错误的解决办法 调用一个远程拷贝的本地Mysql的储存过程 报错:[Err] 1449 - The user specified as a definer ('repl'@'192.168.1.%') does not exist  解决想法: 凭借以前经常见到的[email protected]报错,给root赋值所有权限: grant all privileges on *.* to [email protected]"%" identif

八、mysql视图、存储过程、函数以及时间调度器

1.create or replace view emp_view as select * from t4 ;给t4表创建一个名为emp_view的视图 2.drop view emp_view 删除视图 ======================================= 1.创建一个存储过程(查询所有数据) create procedure p1 () READS SQL DATA BEGIN select * from t4; END 2.创建一个存储过程(查询传参数据) cre

MySql中创建存储过程

MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句.特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗.现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高. 一.MySQL 创建存储过程 "pr_add" 是个简单的

MySQL UUID函数的详解(转)

MySQL UUID函数的详解 MySQL中可以有二类用于生成唯一值性质的工具:UUID()函数和自增序列,那么二者有何区别呢?我们就此对比下各自的特性及异同点: l  都可以实现生成唯一值的功能: l  UUID是可以生成时间.空间上都独一无二的值:自增序列只能生成基于表内的唯 一值,且需要搭配使其为唯一的主键或唯一索引: l  实现方式不一样,UUID是随机+规则组合而成的,而自增序列是控制一个值逐步增长的: l  UUID产生的是字符串类型值,固定长度为:36个字符,而自增序列产生的是整数

mysql 中创建存储过程

mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表employee为例写一个简单的sql存储过程: 下边通过创建一个存储过程实现:输入性别,找出与输入性别相匹配的人的平均年龄,并将平均年龄输出. 这里首先通过delimiter &&,将sql语句的结束符换成&&(默认sql语句的结束符是;) 然后如下所示输入: 此时可以把语句的结束

php中的PDO函数库详解

PHP中的PDO函数库详解 PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,PDO更高效.目前而言,实现“数据库抽象层”任重而道远,使用PDO这样的“数据库访问抽象层”是一个不错的选择. PDO中包含三个预定义的类 PDO中包含三个预定义的类,它们分别是 PDO.PDOStatement 和 PDOException. 一.PDO PDO->beginTransaction(