mysql(创建/修改/删除)自定义函数和存储过程(含实战练习)

本博文源于mysql基础,主要对自定义函数和存储过程进行学习与练习。涉及自定义函数的创建使用与存储过程的创建使用。
在学习本章节的时候,需要用到表和数据,先创建表后插入数据

 create table tb_students_info
    (id INT(11) PRIMARY KEY,
    name VARCHAR(10),dept_id INT(11),
   age INT(11),sex VARCHAR(4),height FLOAT,login_date DATE);

然后插入记录

 insert into tb_students_info values(1,'Dany',1,25,'F',160,'2015-09-10'); 
insert into tb_students_info values(2,'Green',3,23,'F',158,'2016-10-22');
insert into tb_students_info values(3,'Henry',2,23,'M',159,'2016-10-23');
 insert into tb_students_info values(4,'Jane',1,22,'F',156,'2016-10-12');
 insert into tb_students_info values(5,'Jim',1,24,'M',158,'2016-10-22');
 insert into tb_students_info values(6,'John',2,21,'M',152,'2016-10-24');
 insert into tb_students_info values(7,'Lily',6,22,'F',160,'2016-10-25');
 insert into tb_students_info values(8,'Susan',4,23,'F',166,'2016-10-26');
 insert into tb_students_info values(9,'Green',3,22,'M',170,'2016-10-27');
 insert into tb_students_info values(10,'Green',4,23,'M',193,'2016-10-23');

在这里插入图片描述
然后开始练习

为什么要使用自定义函数

自定义函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一样,都是由SQL语句和过程式语句组成的代码片段,并且可以被应用和其他SQL语句调用。

创建并使用自定义函数

CREATE FUNCTION <函数名> ([<参数1> <类型1> [,<参数2><类型2>]]...)
	RETURN <类型>
	<函数主体>

当成功创建自定义函数后,就可以如同调用系统内置函数一样,使用关键字SELECT调用用户自定义的函数,语法格式为:

SELECT <自定义函数名> ([<参数>[,...]]) 

例子:创建存储函数,名称为StuNameById,该函数返回SELECT语句的查询结果,数值类型为字符串类型.并执行函数

create function StuNameById() returns varchar(45) 
return (select name from tb_students_info where id=1);
select StuNameById();

在这里插入图片描述

修改自定义函数

可以使用ALTER FUNCTION 语句来修改自定义函数某些相关特征。若要修改自定义函数的内容,则需要先删除该自定义函数,然后重新创建。

删除自定义函数

语法格式

DROP FUNCTION [IF EXISTS] <自定义函数名>

例子:删除自定义函数StuNameById,查看函数的运行过程

 drop function StuNameById;
 select StuNameById();

在这里插入图片描述

为什么要使用存储过程

因为存储过程可以有效地完成这个数据库操作。存储过程是一组为了完成特定功能的SQL语句表,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

结构控制语句

声明变量

局部变量

在存储过程体中可以声明局部变量,用来存放产生的临时结果。局部变量与全局变量相对应,是在局部范围内有效的变量。

DECLARE <变量名> [,...] <类型> [ DEFAULT <默认值>]

SET语句

变量声明以后,可以使用SET语句为局部变量赋值。

SET <变量名1> = <表达式1> [,<变量名2> = <表达式2>]...

SELECT…INTO语句

可以使用SELECT…INTO语句把选定列的值直接存储到局部变量中,存储过程体中的SELECT…INTO只能返回一行数据

SELECT <列名> [,...] INTO <变量名>

条件控制语句

IF-THEN-ELSE

IF <判断条件> THEN <语句>
[ELSEIF <判断条件> THEN <语句>]
[ELSE ]
END IF

条件判断句CASE

CASE <参数>
WHEN <参数> THEN <语句>
[WHEN <参数> THEN <语句>]
[ELSE  语句]
ENDCASE

CASE 
WHEN <判断条件> THEN <语句>
[ WHEN <判断条件> THEN <语句>]
END CASE

循环控制语句

循环语句LOOP

<标签> LOOP
<语句>
END LOOP [标签]

循环语句WHILE

格式

<标签> WHILE <判断条件> DO
<语句>
END WHILE <标签>

循环语句REPEAT

<标签> REPEAT
<语句>
UNTIL <判断条件>
END REPEAT <标签>

创建存储过程

基本语法

语法格式如下:

CREATE PROCEDURE <过程名> ([过程参数[,..]]) <过程体>
[过程参数[,...]]格式
[IN | OUT | INOUT] <参数名> <类型>

在存储过程的创建中,会遇到DELIMITER命令。在mysql中,服务器处理SQL语句默认是以分号作为语句结束标志的。然后在创建存储过程时,存储过程体可能包含有多条SQL语句,这些SQL语句如果仍以分号作为语句结束符,那么MySql服务器在处理时会以遇到的第一条SQL语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的语句。
语法格式如下:

DELIMITER $$

创建不带参数的存储过程

例子:创建名称为showStuInfo的存储过程,存储过程的作用是从tb_students_info取出信息

 delimiter //
create procedure showStuInfo()
begin
select * from tb_students_info;
end //

然后对存储过程进行调用

delimiter ;
call showStuInfo();

在这里插入图片描述

创建带参数的存储过程

例子:创建名称为GetHeightByStu的存储过程,输入参数是学生姓名。存储过程是通过输入的学生姓名从学生信息表中查询指定学生的身高信息

delimiter //
create procedure GetHeightByStu
(IN name VARCHAR(30))
begin
select height from tb_students_info
where tb_students_info.name = name;
END //

然后创建之后,执行过程

 delimiter ;
call GetHeightByStu('Susan');

在这里插入图片描述

修改存储过程

可以使用ALTER PROCEDURE语句修改存储过程的某些特征。

基本语法

语法格式

ALTER PROCEDURE <过程名> [<特征>...]

修改存储过程的内容和名称

修改存储过程的内容可以通过删除原存储过程,再以相同的命名创建新的存储过程
修改存储过程的名称可以通过删除原存储过程,再以不同的命名创建新的存储过程。

删除存储过程

基本语法

DROP { PROCEDURE | FUNCTION} {IF EXISTS} <过程名>

大家可能看到很多次IF EXISTS,其实这个可以理解为处理异常的关键字,它用来防止因删除不存在的存储过程而引发的错误。

删除存储过程

例子:删除存储过程GetHeightByInfo

 drop procedure GetHeightByStu;
 call GetHeightByStu('Lily');

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/106810226