oracle PL/SQL块匿名块和函数的练习

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;

8、建表、表内数据

点击我,进入本文章所需要的建表命令,以及建表后的表结构和数据。

猜你喜欢

转载自blog.csdn.net/qq_45696288/article/details/122186895
今日推荐