oracle PL/SQL块匿名块和函数的练习
- 1 . 根据学生学号查询学生姓名、所在系。
- 2、学号‘103’同学的平均分若高于80分则显示’成绩优秀!’,否则显示’努力学习!’
- 3、将学号为103同学选修的课程号为3245的课程按成绩划分等级,90分以上’优秀’,80分以上’良好’,70分以上’中等’,60分以上’及格’,其它为不及格。
- 4、根据输入的学号查询该名学生的姓名,若没有输入的学号没有找到,则抛出异常“没有该学生”。
- 5.修改学号为‘107’同学选修的课程号为‘6166’的成绩,若成绩小于60分,则做修改为60分。(如果建表时已经设置了成绩不能超出100的约束,则不能在此表执行)
- 6.创建一个函数,根据输入的课程号,输出最高成绩
- 7、创建名为“F1”的函数,以课程号为参数,返回该门课程的平均成绩。
- 8、建表、表内数据
1 . 根据学生学号查询学生姓名、所在系。
方法一:
declare
vname student.sname%type;
vdepart student.department%type;
vsid student.sid%type:=&a;
begin
select sname,department into vname,vdepart from student where sid=vsid;
dbms_output.put_line('学生'||vname|| '的系别是'|| vdepart);
end;
方法二:(通过自定义记录)
--根据学生学号查询学生姓名、所在系。
declare
type mytype is record(vname student.sname%type,vdept student.department%type);
my mytype;
vsid student.sid%type:=&a;
begin
select sname,department into my from student where sid=vsid;
dbms_output.put_line('学生'||my.vname|| '的系别是'|| my.vdept);
end;

2、学号‘103’同学的平均分若高于80分则显示’成绩优秀!’,否则显示’努力学习!’
declare
avgsal sc.grade%type;
begin
select avg(grade) into avgsal from sc where sid=103;
if avgsal>80 then
dbms_output.put_line('兄弟你牛啊,你平均分 ' || avgsal || ' 分,成绩优秀啊,牛牛牛');
else
dbms_output.put_line('兄弟,你平均分是:'|| avgsal || ' 分,但是没关系,我们要继续努力哦,嘿嘿');
end if;
end;

3、将学号为103同学选修的课程号为3245的课程按成绩划分等级,90分以上’优秀’,80分以上’良好’,70分以上’中等’,60分以上’及格’,其它为不及格。
方法一:
declare
vgrade sc.grade%type;
begin
select grade into vgrade from sc where sid=103 and cid=3245;
if vgrade>90 then dbms_output.put_line('优秀!');
elsif vgrade>80 and vgrade<=90 then dbms_output.put_line('良好!');
elsif vgrade>70 and vgrade<=80 then dbms_output.put_line('中等!');
elsif vgrade>60 and vgrade<=70 then dbms_output.put_line('及格!');
else dbms_output.put_line('不及格');
end if;
end;
方法二:
--将学号为103同学选修的课程号为3245的课程按成绩划分等级,90分以上’优秀’,80分以上’良好’,70分以上’中等’,60分以上’及格’,其它为不及格。
declare
vgrade sc.grade%type;
begin
select grade into vgrade from sc where sid=103 and cid=3245;
case
when vgrade>90 then dbms_output.put_line('优秀!');
when vgrade>80 and vgrade<=90 then dbms_output.put_line('良好!');
when vgrade>70 and vgrade<=80 then dbms_output.put_line('中等!');
when vgrade>60 and vgrade<=70 then dbms_output.put_line('及格!');
else dbms_output.put_line('不及格');
end case;
end;

4、根据输入的学号查询该名学生的姓名,若没有输入的学号没有找到,则抛出异常“没有该学生”。
方法一:普通抛出异常
declare
vno student.sid%type := &a;
name student.sname%type;
begin
select sname into name from student where sid=vno;
dbms_output.put_line('学号为 '||vno||' 的姓名是:'||name);
exception
when no_data_found then
dbms_output.put_line('你这个学号可能输的不正确,因为我没有查找到该名学生,嘻嘻');
end;

方法二:抛出自定义异常
--4.根据输入的学号查询该名学生的姓名,若没有输入的学号没有找到,则抛出异常“没有该学生”。 请使用自定义异常来完成哦
declare
vno student.sid%type := &a;
name student.sname%type;
vcount number;
myexception exception;
begin
select count(*) into vcount from student where sid=vno;
-- dbms_output.put_line(vcount);
if vcount>0 then
select sname into name from student where sid=vno;
dbms_output.put_line('学号为 '||vno||' 的姓名是:'||name);
else
raise myexception;
end if;
exception
when myexception then
dbms_output.put_line('你这个学号 '|| vno ||' 可能输的不正确,因为我没有查找到该名学生,嘻嘻');
end;

5.修改学号为‘107’同学选修的课程号为‘6166’的成绩,若成绩小于60分,则做修改为60分。(如果建表时已经设置了成绩不能超出100的约束,则不能在此表执行)
declare
vgrade sc.grade%type;
begin
select grade into vgrade from sc where sid=107 and cid=6166;
if vgrade<60 then
update sc set grade=60 where sid=107 and cid=6166;
dbms_output.put_line('同学,你的这门课程得了'||vgrade||'分,可是不及格啊,不过老师帮你改到60分啦,快感谢老师吧,嘿嘿哈哈哈哈');
else
dbms_output.put_line('同学,你的这门课程得了'||vgrade||'分,及格啦,老师就不帮你改成绩啦,(。-ω-)zzz');
end if;
end;


6.创建一个函数,根据输入的课程号,输出最高成绩
create or replace function myfunc(cno sc.cid%type) return sc.grade%type
is
maxgrade sc.grade%type;
begin
select max(grade) into maxgrade from sc where cid=cno;
return maxgrade;
end;
declare
vno sc.cid%type:=&no;
begin
dbms_output.put_line('课程号为'||vno||'的最高成绩是:'||myfunc(vno)||'分');
end;

7、创建名为“F1”的函数,以课程号为参数,返回该门课程的平均成绩。
create or replace function f1(cno sc.cid%type) return sc.grade%type
is
avgsal sc.grade%type;
begin
select avg(grade) into avgsal from sc where cid=cno;
return avgsal;
end;
declare
cid sc.cid%type := &no;
begin
dbms_output.put_line('课程号为:'||cid || '的平均成绩的分数为:'||f1(cid));
end;
