X  
登录

还没有账号?立即注册

忘记密码?
登陆
X  
注册

已经有账号?马上登陆

获取验证码
重新获取(60s)
立即注册
统计
  • 建站日期:2021-03-10
  • 文章总数:518 篇
  • 评论总数:155 条
  • 分类总数:32 个
  • 最后更新:4月20日
文章 mysql语言

MySQL存储过程与函数--范例,让你更容易

梦幻书涯
首页 mysql语言 正文

存储过程与函数之间的不同之处在于:

Ø    函数必须有且仅有一个返回值,且必须指定返回值数据类型(返回值类型目前仅仅支持字符串、数值类型)。存储过程可以没有返回值,也可以有返回值,甚至可以有多个返回值,所有的返回值需要使用out或者inout参数定义。
Ø 函数体内可以使用select…into语句为某个变量赋值,但不能使用select语句返回结果(或者结果集)。存储过程则没有这方面的限制,存储过程甚至可以返回多个结果集

    





delimiter $$
create function fanname(zkchar(12))
returns char(8)
begin
        declare newname char(12);
        select name into newname from studentwhere zkzh=zk;
  RETURNnewname;
end$$
delimiter;




6.15调用例6.14的存储函数,根据输入的学号判断是否是赵宁宁,如果是则删除此学生信息,不是则返回flase 

delimiter $$

create function delname(zkchar(12))

returns boolean

begin

        declare stuname char(8);

  setstuname=fanname(zk);

        if stuname='赵宁宁' then

               delete from student wherename=stuname;

              return true;

        else

             return false;

        end if;

end$$

delimiter;

调用方法:selectdelname (120101101);



1、    choose数据库中创建存储过程get_pro_student_course(),该存储过程具有以下功能:给定一个学生学号,统计该生已经选修哪些课程,包括课程编号,课程名称,成绩。

drop  procedure if exists get_pro_student_course;

delimiter $$

create procedure get_pro_student_course(in zkchar(20))

begin

select course.course_no,course_name,score fromchoose,course where choose.course_no=course.course_no and student_no=zk;

end $$

delimiter ;

2、    调用存储过程get_pro_student_course,查询学号2012001的选修课程信息。

call get_pro_student_course('2012001');



3、    choose数据库中创建存储过程get_pro_course_student(),该存储具有以下功能:给定一门课程(例如course_no=1的课程),统计哪些学生选修了这门课程,显示院系名称,班级名称,学号,姓名,查询结果先按院系排序,院系相同的按照班级排序,班级相同的按照学号排序。

drop  procedure if exists get_pro_course_student;

delimiter $$

create procedure get_pro_course_student(in cno int)

begin

selectdepartment_name,class_name,student.student_no,student_name from student joinclasses on student.class_no=classes.class_no join choose onstudent.student_no=choose.student_no where course_no=cno order bydepartment_name,class_name,student.student_no;

end $$

delimiter ;



4、    调用存储过程get_pro_course_student(),查询course_no=1的学生情况。

call get_pro_course_student(1);

 

查询过程的详情:

show create procedureget_pro_course_student;



5、    创建一个带参数的函数,能根据不同学号查询出此学生所在的班级id

 delimiter $$
create function fancid(zk char(11))
returns int
begin
declare cno int;
select class_no into cno from studentwhere student_no=zk;
RETURN cno;
end$$
delimiter ;


6、    在数据库choose中创建存储过程get_choose(),该存储过程接收学生学号以及课程号为输入参数,经过存储过程一系列处理,返回状态state值。如果状态的值大于0,则说明学生选课成功;如果状态state的值等于-1,则意味着该生已经选修了该门课程;如果状态state的值等于-2,则意味着该生已经选修了两门课程,如果状态state的值等于-3,则意味着该门课程未通过审核或者已经报满。该存储过程需进行错误处理。(参考选课流程图,完成代码填空)

 




drop  procedure if exists get_choose;

 

delimiter $$

create procedure get_choose(in s_no char(11),inc_no int(11),out state int(4) )

begin

declare s1 int(4);

declare s2 int(4);

declare s3 int(4);

declare flag char(10);

set state=0;

set flag="未审核";

 

select count(*) into s1 from choose wherestudent_no = s_no and course_no = c_no;

if s1>1 then set state=-1;

else

select status into flag from course wherecourse_no=c_no;

select available into s3 from course wherecourse_no=c_no;

if flag="未审核"||s3=0 then set state=-3;

else

insert into choose(student_no,course_no)values(s_no,c_no);

set state=last_insert_id();

end if;

end if;

end $$

delimiter;

 

call get_choose('2012002',4,@state);

select @state;

 

call get_choose('2012002',2,@state);

select @state;

 

call get_choose('2012003',1,@state);

select @state;

 

call get_choose('2012003',2,@state);

select @state;

 

call get_choose('2012003',3,@state);

select @state;

call get_choose('2012003',4,@state);

select @state;

 

call get_choose('2012003',6,@state);

select @state;

 

 


版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

-- 展开阅读全文 --
这篇文章最后更新于2020-7-3,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
Spring全面需要注意的事项和知识点,复习必备
« 上一篇
MySQL索引--范例,让你更容易
下一篇 »

发表评论

HI ! 请登录
注册会员,享受下载全站资源特权。
登陆 注册
永远的少年,永远的梦

热门文章