本博文源于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 <自定义函数名> ([<参数>[,...]])
create function StuNameById() returns varchar(45)
return (select name from tb_students_info where id=1);
select StuNameById();
可以使用ALTER FUNCTION 语句来修改自定义函数某些相关特征。若要修改自定义函数的内容,则需要先删除该自定义函数,然后重新创建。
语法格式
DROP FUNCTION [IF EXISTS] <自定义函数名>
drop function StuNameById;
select StuNameById();
因为存储过程可以有效地完成这个数据库操作。存储过程是一组为了完成特定功能的SQL语句表,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
在存储过程体中可以声明局部变量,用来存放产生的临时结果。局部变量与全局变量相对应,是在局部范围内有效的变量。
DECLARE <变量名> [,...] <类型> [ DEFAULT <默认值>]
变量声明以后,可以使用SET语句为局部变量赋值。
SET <变量名1> = <表达式1> [,<变量名2> = <表达式2>]...
可以使用SELECT…INTO语句把选定列的值直接存储到局部变量中,存储过程体中的SELECT…INTO只能返回一行数据
SELECT <列名> [,...] INTO <变量名>
IF <判断条件> THEN <语句>
[ELSEIF <判断条件> THEN <语句>]
[ELSE ]
END IF
CASE <参数>
WHEN <参数> THEN <语句>
[WHEN <参数> THEN <语句>]
[ELSE 语句]
ENDCASE
或
CASE
WHEN <判断条件> THEN <语句>
[ WHEN <判断条件> THEN <语句>]
END CASE
<标签> LOOP
<语句>
END LOOP [标签]
格式
<标签> WHILE <判断条件> DO
<语句>
END WHILE <标签>
<标签> REPEAT
<语句>
UNTIL <判断条件>
END REPEAT <标签>
语法格式如下:
CREATE PROCEDURE <过程名> ([过程参数[,..]]) <过程体>
[过程参数[,...]]格式
[IN | OUT | INOUT] <参数名> <类型>
在存储过程的创建中,会遇到DELIMITER命令。在mysql中,服务器处理SQL语句默认是以分号作为语句结束标志的。然后在创建存储过程时,存储过程体可能包含有多条SQL语句,这些SQL语句如果仍以分号作为语句结束符,那么MySql服务器在处理时会以遇到的第一条SQL语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的语句。
语法格式如下:
DELIMITER $$
delimiter //
create procedure showStuInfo()
begin
select * from tb_students_info;
end //
然后对存储过程进行调用
delimiter ;
call showStuInfo();
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,其实这个可以理解为处理异常的关键字,它用来防止因删除不存在的存储过程而引发的错误。
drop procedure GetHeightByStu;
call GetHeightByStu('Lily');