这里写自定义目录标题
- 一 实验目的
- 二 实验平台
- 三 实验内容和要求
- 3.1 创建存储过程
- 3.2 查看存储过程
- 3.3 修改存储过程
- 3.4 删除存储过程
- 3.5 创建函数
- 3.6 查看函数
- 3.7 删除函数
一 实验目的
- 掌握 MySQL 块结构、MySQL 的基本语法、MySQL 的流程控制语句;
- 掌握 MySQL 块中使用游标的方法;
- 掌握 MySQL 异常处理技术。
- 掌握存储过程、函数数据库对象的基本作用;
- 掌握存储过程、函数的建立、修改、查看、删除等操作
二 实验平台
- 操作系统: Windows 10;
- 数据库MySQL Server 8.0,MySQL Workbench
三 实验内容和要求
任务中涉及的数据表是在**员工医疗保险系统(实验 03)**中给出的表。
3.1 创建存储过程
- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)为员工医疗
保险系统(实验 03 创建的 7 个表)创建存储过程“sex_pro”,通过传入参数传入性
别(男或女),显示员工表“staff”中不同性别的员工人数。并调用该存储过程,测试
运行结果。
-- 3.1.1
delimiter //
create procedure sex_pro(in sex char,out num int)
begin
set num = (select count(*) from staff where ssex=(sex));
end;
call sex_pro('男',@num);
select @num;- 创建一个存储过程“cno_pro”,通过输入医保卡号,输出该医保卡的全部
消费信息。并调用该存储过程,测试运行结果。
-- 3.1.2
delimiter //
create procedure cno_pro(in cno char)
begin
select * from consume where cno = (cno);
end;
call cno_pro();
-- 测试2题
delimiter //
create procedure aaa(in cno char)
begin
select * from staff where sno = (cno);
end;
call aaa(1);- 创建一个存储过程“insert_pro”,该存储过程可以向员工表“staff”中插入
员工信息;如果向员工表“staff”插入已经存在的员工编号,自定义异常处理,则显示自定义错误消息“MySQL 1062:该员工编号已存在”,否则显示“员工信息插入成功!”(注:Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY))。该题选做!
3.2 查看存储过程
- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)查看员工医
疗保险数据库中的所有存储过程的状态、以及创建存储过程的语句;
-- 3.2.1
show procedure status where db='db_test_学号';- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)从数据字典
中查看员工医疗保险数据库中的所有存储过程
-- 3.2.2 不确定
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='db_test_学号' AND ROUTINE_TYPE='PROCEDURE';3.3 修改存储过程
- 使用MySQL命令行或者workbench(或者Navicat for MySQL)修改存储过程
“sex_pro”,通过输入参数传入性别(男或女),通过输出参数得到员工表“staff”中不
同性别的员工人数,并执行该存储过程,显示员工表“staff”中不同性别的员工人数。
-- 3.3.1
-- ALTER {PROCEDURE | FUNCTION}……语句只能改变存储过程的特征,
-- 不能修改过程的参数以及过程体。如果想做这样的修改,
-- 必须先使用DROP PROCEDURE 删除过程,然后使用and CREATE PROCEDURE重建过程。
drop procedure sex_pro;
delimiter //
create procedure sex_pro(in sex char,out num int)
begin
if sex='男' then
set num = (select count(*) from staff where ssex='女');
end if;
if sex='女' then
set num = (select count(*) from staff where ssex='男');
end if;
end;
call sex_pro('女',@num);
select @num;3.4 删除存储过程
- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)删除存储过
程“sex_pro”。
drop procedure sex_pro- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)删除存储过
程“cno_pro”。
drop procedure cno_pro;3.5 创建函数
- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)创建函数
“num_fun”,该函数可以计算 1+3+5+7+9+……+N,其中 N 位任意的正整数;并调
用该函数,测试运行结果。
-- 3.5.1
delimiter //
create function num_fun(last_num int) returns int
begin
declare js int;
declare i int;
set i = 1;
set js = 0;
while i<=last_num do
set js=js+i;
set i=i+2;
end while;
return js;
end
//
select num_fun(9);
drop function if exists num_fun
-- This function has none of DETERMINISTIC, NO SQL解决办法
show variables like 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators = 1 ;
show variables like ' log_bin_trust_function_creators ';- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)在员工医疗
保险系统(实验 03 创建的 7 个表)数据库中创建函数“card_fun”,通过传入参数
传入医保类型(企业、事业或是灵活就业),返回医保卡表“card”中该类型的医保卡
数量,并调用该函数,测试运行结果。
-- 3.5.2
delimiter //
create function card_fun(YBtype char(10)) returns int
begin
return (select count(*) from card where ctype=(YBtype));
end
//
select card_fun('企业');
drop function if exists card_fun;- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)在员工医疗
保险系统(实验 03 创建的 7 个表)数据库中创建函数“staff_fun”,通过传入参数
传入员工的编号,根据传入的员工编号,检查该员工是否存在。如果存在,则返
回 TRUE,否则返回 FALSE,并调用该函数,测试运行结果。
-- 3.5.3 不完善
delimiter //
create function staff_fun(insno int) returns boolean
begin
if (select count(sno) from staff where sno=(insno))=0 then
return false;
else return true;
end if;
end
//
select staff_fun(22);
drop function if exists staff_fun;- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)在员工医疗
保险系统(实验 03 创建的 7 个表)数据库中创建函数“sex_fun”,利用传入参数传
入性别(男或女),返回员工表“staff”中不同性别的员工人数,并调用该函数,注意
比较与存储过程“sex_pro”的差别。
-- 3.5.4
delimiter //
create function sex_fun(insex char)returns int
begin
declare num int;
if insex='男' then
set num = (select count(*) from staff where ssex='男');
end if;
if insex='女' then
set num = (select count(*) from staff where ssex='女');
end if;
return num;
end;
select sex_fun('男');
drop function if exists sex_fun;3.6 查看函数
- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)查看员工医
疗保险数据库中的上面创建的所有函数的状态、以及创建函数的语句;
-- 3.6.1
show function status where db='db_test_学号';- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)从数据字典
中查看员工医疗保险数据库中的上面所创建的所有函数。
-- 3.6.2 不确定
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='db_test_学号' AND ROUTINE_TYPE='function';3.7 删除函数
- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)删除函数
“staff_fun”。
drop function if exists staff_fun;- 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)删除函数
“card_fun”。
drop function if exists card_fun
















