数据库复习

Oracle数据库复习

练习题

实验一:创建数据环境

用户及权限

1、创建用户utest,密码为utest1。

create user utest identified by utest1;

identified by后接密码 如果创建用户失败 请在用户名前+c##(oracle12)

2、为utest用户赋予connect权和dba权。

grant connect,dba to utest;

dba:拥有dba权限的用户可以创建数据库结构,可以创建授权用户 *

resource: 拥有resource权限的用户可以创建数据库结构,不可以创建授权用户(没有connect无法登陆)

connect: 拥有connect权限的用户只可以登录,不可以创建数据库结构和创建授权用户

对于普通用户:授予connect, resource权限。

对于DBA管理用户:授予connect,resource, dba权限。

系统权限只能由DBA用户授出:sys, system(最开始只能是这两个用户)

授权命令:grant connect, resource, dba to 用户名1,用户2…

Oracle安装会自动生成sys,system两个用户 sys是超级管理员,密码as sysdba system是系统管理员,密码自定义 自定义用户:创建用户的时候必须以c##开头*

3、收回utest用户dba权限。

revoke dba from utest;

小结

1.GRANT 赋于权限
常用的系统权限集合有以下三个:
CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理)

常用的数据对象权限有以下五个:
ALL ON 数据对象名, SELECT ON 数据对象名, UPDATE ON 数据对象名,
DELETE ON 数据对象名, INSERT ON 数据对象名, ALTER ON 数据对象名

GRANT CONNECT, RESOURCE TO 用户名;
GRANT SELECT ON 表名 TO 用户名;
GRANT SELECT, INSERT, DELETE ON表名 TO 用户名1, 用户名2;

2.REVOKE 回收权限
REVOKE CONNECT, RESOURCE FROM 用户名;
REVOKE SELECT ON 表名 FROM 用户名;
REVOKE SELECT, INSERT, DELETE ON 表名 FROM 用户名1, 用户名2;

4、使用utest用户登录。(使用connect命令)。

connect utest/utest1;
创建数据环境

1.创建Student表

create table student(
    sno char(10) primary key,
    sname varchar(20),
    ssex char(2),
    sage smallint,
    sdept varchar(20)
);
mysql中varchar与oracle中的varchar2
1.varchar是标准**sql**里面的。 varchar**2**是**oracle**提供的**独有**的数据类型。

2.varchar对于**汉字占两个字节**,对于**英文**是**一**个字节,占的内存小,varchar2都是占两个字节。

3.varchar对空串不处理,varchar**2**将空串当做**null**来处理。

4.varchar存放固定长度的字符串,最大长度是**2000**,varchar**2**是存放可变长度的字符串,最大长度是**4000**.

5.如果是要跟换不同的数据库,例如**mysql**,那么**就用varchar**,如果就用oracle,那么用varchar2比较好一点。

2.创建course表

create table course(
    cno char(10) primary key,
    cname varchar(20),
    cpno char(10),
    ccredit smallint
);

3.创建sc表

create table sc(
    sno char(10),
    cno char(10),
    Grade smallint,
    primary key(sno,cno)
);
修改表结构

1、为course表添加一列snumber(最大选课人数),类型为char(10)。

ALTER table course add snumber char(10);
alter table course add snumber char(10);

2、修改course表中snumber列,将其类型改为int。

alter table course modify snumber int;
alter table course modify snumber int;

3、删除course表中的snumber列。

alter table course drop column snumber;
alter table course drop column snumber;
删除表
--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--************1、删除student,course和sc表,其中sc表建立了外码(请注意删除顺序)*********************
drop table sc;
drop table student;
drop table course;

drop table sc;
drop table student;
drop table course;

--***********End*************************

实验二:sql复习

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CmGMLFN-1609600230326)(C:\Users\1\AppData\Roaming\Typora\typora-user-images\image-20201217104026646.png)]

insert into Course (cno,cname,ccredit,snumber)
values ('C50','Oracle','4','100');
Commit;

insert into course (cno,cname,cpno,ccredit,snumber)
values ('C50','Oracle','4','100');
commit;
--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********2、使用Insert语句为CS系学生学生选择必修课C50。************
insert into sc(sno,cno)
Select sno,'C50' From student
Where sdept = 'CS' 
;
--***************END*************
Commit; 
--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********3、将Oracle课程的先行课修改为“DB”课程的课程号(使用子查询完成)************
update Course
set cpno = (select cno from Course 
                   where cname='DB')
where cname = 'Oracle';
--***************END*************
Commit;
--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********4、将CS系"DB"课程成绩为空的学生选课信息删除************
Delete from SC
    where sno in(select sno from student where sdept='CS') and cno in (select cno from Course where cname ='DB') and grade is null;
--***************END*************
Commit;

1、查询CS系年龄大于20岁的学生,列出学号,姓名,性别。

--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********1、查询CS系年龄大于20岁的学生,列出学号,姓名,性别。************
select sno,sname,ssex
from Student
where sage>20 and sdept='CS';
--***************END*************

2、查询选了’DB’课程的学生的学号。


--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********2、查询选了'DB'课程的学生的学号。************

select SC.Sno 
from SC,Course
where Course.Cno =SC.Cno and Cname ='DB'
;

--***************END*************

3、查询CS系没有选’DB’课程的学生的学号,姓名,系。


--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********3、查询CS系没有选'DB'课程的学生的学号,姓名,系。************

select sno,sname,sdept
from student
where sdept='CS' and sno not in(select sno from sc where cno=
(select cno from course where cname='DB'));


--***************END*************

4、查询男(‘m’)同学选择了’DB’课程,但是没有选’Oracle’课程的学生,列出学号,姓名。(课程名要区分大小写)

--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********4、查询男同学选择了'DB'课程,但是没有选'Oracle'课程的学生,列出学号,姓名************
select sno,sname
from student
where ssex='m' and sno in (select sno 
from sc
where cno=(select cno from course where cname='DB')
and sno not in (
    select sno 
    from sc
    where cno=(select cno from course where cname='Oracle')
));
--***************END*************

1、查询每个学生的平均分,列出学生的学号,平均分(列名为savg),并按平均分降序排列。


--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********1、查询每个学生的平均分,列出学生的学号,平均分(savg),并按平均分降序排列。************

select student.sno,avg(grade) savg
from sc,student
where sc.sno=student.sno
group by student.sno
order by avg(grade) desc;

--***************END*************

2、查询选课人数大于等于3人的课程,列出课程号,课程名,选课人数(列名为scnt),并按课程号升序排列。


--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********2、查询选课人数大于等于3人的课程,列出课程号,课程名,选课人数(scnt),并按课程号升序排列。************
select sc.cno,cname,count(sc.sno) scnt
from sc,course
where sc.cno=course.cno
group by sc.cno,cname
having count(sc.sno)>=3
order by sc.cno;


--***************END*************

3、查询选课人数最多的课程。列出课程号,课程名。


--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********3、查询选课人数最多的课程。列出课程号,课程名。************
select sc.cno,cname
from course,sc
where course.cno=sc.cno
group by sc.cno,cname
having count(*)>=all(select count(*) from sc group by sc.cno);


--***************END*************

4、查询CS系选课人数最多的课程。列出课程号,课程名,CS系的选课人数(列名为CScnt)。


--***PS:如果没有查询结果,有可能是语句结尾没有分号;***
--***********4、查询CS系选课人数最多的课程。列出课程号,课程名,CS系的选课人数(CScnt)。************

select sc.cno,cname,count(sno) CScnt
from course,sc
where course.cno=sc.cno and sno in (select sno from student where sdept='CS')
group by sc.cno,cname
having count(sno) >= all(select count(sno) from sc where sno in (select sno from student where sdept='CS')group by sc.cno);

--***************END*************

实验三:PL/SQL匿名块

1、打印001号学生的姓名和年龄。打印结果格式(忽略行标号,其中冒号为中文状态下的冒号):

001号同学的姓名:查询出的姓名

001号同学的年龄:查询出的年龄

declare
    namesel varchar2(20);
    agesel smallint;
begin
    select sname into namesel from student where sno = '001';
     select sage into agesel from student where sno = '001';
    dbms_output.put_line('001号同学的姓名:'||namesel);
    dbms_output.put_line('001号同学的年龄:'||agesel);     
end; 

2、将年龄最大的同学的学号,姓名,年龄打印出来(注:年龄最大的同学只有一个)。其格式为(忽略行标号): 查询出来的学号,查询出来的姓名,查询出来的年龄,性别(查询出来的性别,若是’f’,显示:美女。若是’m’显示:帅哥。) 例如:(其中逗号为英文状态下的逗号) 001,张三,20,美女

declare 
    vsno student.sno%type;
    vsname student.sname%type;
    vsage student.sage%type;
    vssex student.ssex%type;
begin
    select sno,sname,sage,ssex into vsno,vsname,vsage,vssex from student where sage>=all(select sage from student);
    if vssex='m' then       dbms_output.put_line(trim(vsno)||','||vsname||','||vsage||','||'帅哥');
    else       dbms_output.put_line(trim(vsno)||','||vsname||','||vsage||','||'美女');
    end if;

end;

注:为了使一个变量的数据类型与另一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了*%TYPE定义方式。当被参照的那个变量的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL*程序了。当不能确切地知道被参照的那个变量的数据类型时,就只能采用这种方法定义变量的数据类型。

3、将‘004’号同学的年龄改为18岁,系别改为‘E’,为CS系年龄最小的同学选‘C01’号课程。

begin
    update student set sage=18,sdept='E' where sno='004';
    insert into sc(sno,cno)
    	select sno,'C01' 
    	from student
    	where sdept='CS' and sno in (
        	select sno from student where sage<=all(
            select sage from student where sdept='CS')
        );
    commit;
end;

4、为‘002’号同学选‘C02’课程。将选课人数最多的课程的最大选课人数(snumber)改为105。

begin
    insert into sc(sno,cno) values('002','C02');
    update course
    	set snumber=105
    	where cno=(
            select cno from sc group by cno having count(*)>=all(
                select count(*) from sc group by cno));
    commit;
end;

实验四:异常处理

1、查询‘111’号同学的姓名,使用异常判断,若没有这个同学,则添加一条学号为‘111’的学生信息,姓名为‘张三’,其他属性为空,并输出:‘111’号同学已被成功添加。
若存在该同学,则输出(冒号为中文状态下的冒号):
111号同学的姓名:查询出的姓名
若不存在该同学,则输出:
111号同学已被成功添加。

declare
vname varchar(20);
begin
select sname into vname from student where sno = '111';
dbms_output.put_line('111号同学的姓名:'||vname);
exception when no_data_found then 
    insert into student (sno,sname) values ('111','张三');
    dbms_output.put_line('111号同学已被成功添加。');
    commit;
end;

2、打印‘C50’号课程的当前选课人数和最大选课人数(Snumber)。若出现异常,则判断C50号课程是否存在,若不存在,则添加C50课程(’C50’,’NewCourse’,null,3,100),再让001号同学和003号同学选修C50号课程,成绩分别为80分和90分,最后打印C50号课程的当前选课人数和最大选课人数。打印格式如下:
若C50存在,则打印格式如下(其中的逗号和冒号是中文状态下的):
(查询出的C50的课程名)课程当前选课人数:(查出来的人数),最大选课人数:(查出来的最大人数) 如:DB课程当前选课人数:80,最大选课人数:100
若C50不存在,则打印格式(其中的逗号和冒号是中文状态下的):
添加NewCourse课程成功,课程当前选课人数:(查出来的人数),最大选课人数:(查出来的最大人数) 如:添加NewCourse课程成功,课程当前选课人数:10,最大选课人数:100

 declare
currentnum int;
maxnum int;
vname varchar(20);
begin
select snumber,cname into maxnum,vname from course where cno ='C50';
select count(*) into currentnum from sc where cno ='C50' ;
dbms_output.put_line(vname||'课程当前选课人数:'||currentnum||',最大选课人数:'||maxnum);
exception when no_data_found then
    insert into course values('C50','NewCourse',null,3,100);
    insert into sc values('001','C50',80);
    insert into sc values('003','C50',90);
    commit;
    select snumber,cname into maxnum,vname from course where cno ='C50';
    select count(*) into currentnum from sc where cno ='C50' ;
    dbms_output.put_line('添加NewCourse课程成功,课程当前选课人数:'||currentnum||',最大选课人数:'||maxnum);
end;

3.为English系年龄最大的同学选C52课程,并打印选课结果和该同学的选课数,若该生已经选择了C52课程,则打印该生的平均分。使用嵌套块中的异常判断,若没有English系,则将Student表中的E系修改为English系,并打印:已成功将E系修改为English系,然后退出程序。若没有C52课程,请添加C52课程(’C52’,’NC’,null,2,100)并打印:C52课程添加成功,然后退出程序。 注意:该程序要成功执行的前提是English系的最大年龄对应的同学只能有一个。若在你们自己的系统下测试,请通过修改数据确保这个前提条件。 **测试规则:**底层将通过调用四次程序,查看程序输出是否正确。 (1)若学生和课程都存在,则为其选课,并输出(冒号为中文状态下的冒号): 已为(查询出的姓名)同学选择了课程(查询出来的课程名),该同学的选课门数为:(查询出的选课门数) 如:已为张三同学选择了课程DB,该同学的选课门数为:10 (2)若该生已经选择了课程C52,则输出: (查询出的姓名)同学的平均成绩为:(查询出的平均分) 如:张三同学的平均成绩为:85 (3)若系别不存在,则修改数据后,输出: 已成功将E系修改为English系 (4)若课程不存在,则添加数据后,输出: C52课程添加成功


--***********1、嵌套块异常处理第一题*****************

 
declare
    vsno char(10);
    vsname varchar(20);
    vcname varchar(20);
    num int;
    avggrade int;
begin
    select sno,sname into vsno,vsname from student where sage =(select max(sage) from student where sdept='English') and sdept = 'English';
    
    begin
        select cname into vcname from course where cno='C52';
        insert into sc values(vsno,'C52',null);
        select count(*) into num from sc where sno=vsno;
        commit;
        dbms_output.put_line('已为'||vsname||'同学选择了课程'||vcname||',该同学的选课门数为:'||num);
        exception when no_data_found then 
                insert into course values('C52','NC',null,2,100);
                commit;
                dbms_output.put_line('C52课程添加成功');
            when dup_val_on_index then
                select avg(grade) into avggrade from sc where sno =vsno;
                dbms_output.put_line(vsname||'同学的平均成绩为:'||avggrade);
    end;

    exception when no_data_found then
        update student set sdept ='English' where sdept ='E';
        commit;
        dbms_output.put_line('已成功将E系修改为English系');
end;

--***********End*******************************************
/

实验五:游标

1、使用静态游标,遍历所有选择了“数学”的CS系学生,列出学生的学号,姓名,成绩(按学号升序排列)。(使用rpad对齐打印,其中学号占10个长度,姓名占10个长度)打印格式要求如下:

学号 姓名 成绩

————————– (一共25个减号)

001 张三 85

002 李四 90

 declare
    cursor csr_s IS
        select sc.sno,sname,grade
        from student,sc,course 
        where student.sno = sc.sno and sc.cno = course.cno and cname =  '数学' and sdept = 'CS'
        order by sc.sno ASC;
begin
    dbms_output.put_line('学号      姓名      成绩');
    Dbms_Output.put_line('-------------------------');
    for i in csr_s loop
        Dbms_Output.put_line(rpad(i.sno,10,' ')||rpad(i.sname,10,' ')||rpad(i.grade,10,' '));
    end loop;
end;

2、使用静态游标,遍历所有CS系学生的选课信息,打印学号,姓名,系别,课程名,成绩(按学号和课程名升序排列)。(使用rpad对齐打印,学号,姓名,系别和课程号都各占10个长度,学生变了用横线区分开)打印格式要求如下:

学号 姓名 系别 课程名 成绩 ============================================(一共45个等号)

001 张三 CS C语言 78

001 张三 CS 数据库 90

001 张三 CS 英语 80

——————————————–(一共45个减号)

002 李四 CS 数学 85

002 李四 CS 英语 75

declare
    cursor c1 is
        select sc.sno,sname,sdept,cname,grade
        from student,sc,course
        where student.sno = sc.sno and sc.cno = course.cno and sdept = 'CS'
        order by sc.sno,cname;
    stu_sno student.sno%type;
    c c1%rowtype;
begin
    open c1;
    fetch c1 into c;
    stu_sno := c.sno;
    close c1;
    dbms_output.put_line('学号      姓名      系别      课程名    成绩');
   
    dbms_output.put_line('=============================================');
    for i in c1 loop
        if stu_sno <> i.sno then
            DBms_output.put_line('---------------------------------------------');
            stu_sno := i.sno;
        end if;
        dbms_output.put_line(rpad(i.sno,10,' ')||rpad(i.sname,10,' ')||rpad(i.sdept,10,' ')||rpad(i.cname,10,' ')||rpad(i.grade,10,' '));
    end loop;
end;

实验六:存储过程和函数

函数

1、创建函数Fs1,传入课程号,返回字符型。返回该课程的先行课名。若该课程不存在,则返回格式如下(3)所示,若该课程没有先行课,则返回格式如下(2)所示。

要求:
1、不能在函数中使用dbms_output.put_line打印数据,必须是通过Return将结果传出。 2、创建完函数后,请使用匿名块多次调用该函数,分别按顺序传入‘C06’,‘C01’,‘C001’。并将返回的结果分别打印出来。
输出格式说明:
(1)若传入课程有先行课(冒号为中文状态下的冒号):
(通过传入的课程号查询出的课程名)课程的先行课为:(先行课名)
例如:Oracle课程的先行课为:数据库
(2)若传入的课程没有先行课(cpno为null):
(通过传入的课程号查询出的课程名)课程没有先行课。
(3)若传入的课程不存在:
(传入的课程号)课程不存在。


--***********1、完成函数第一题的创建*****************
create or replace function Fs1(vcno in char)
return varchar2
is 
cname1 varchar(20);
vcpno char(10);
vcname varchar(20);
begin
  select cpno,cname into vcpno,vcname from course where cno=vcno;
  if(vcpno is null) then
           return (vcname||'课程没有先行课。');
  end if;
  select cname into cname1 from course where cno = vcpno;
  return (vcname||'课程的先行课为:'||cname1);
  exception when no_data_found  then
            return (vcno||'课程不存在。');     
end;

--***********End*******************************************
/

--***********完成测试程序*****************
begin
    dbms_output.put_line(Fs1('C06'));
    dbms_output.put_line(Fs1('C01'));
    dbms_output.put_line(Fs1('C001'));
end;


--***********End*******************************************
/

2、创建函数Fs2,传入学生学号,返回数值型。返回该学生选课的成绩的课程数,若该学生不存在,则返回-1。
要求:
1、不能在函数中使用dbms_output.put_line打印数据,必须是通过Return将结果传出。 2、创建完函数后,请使用匿名块调用该函数,多次调用函数,分别按顺序传入‘001’,‘018’,‘123’。并将返回的结果分别按要求打印出来。
若返回-1,则打印:
001号同学不存在。
若返回选课数,则打印(冒号为中文状态下的冒号):
001号同学的选课门数为:(返回的选课数)


--***********2、完成函数第二题*****************
create or replace function Fs2(vsno char)
return int
is
vcount int;
vcount2 int;
begin
  select count(*) into vcount from sc where sno=vsno;
  select count(*) into vcount2 from student where sno=vsno;
  if(vcount2=0) then
    return -1;
  end if;
  return vcount;
end;


--***********End*******************************************
/
--***********完成测试程序*****************
begin
    if(Fs2('001')=-1)then
        dbms_output.put_line('001号同学不存在。');
    else 
        dbms_output.put_line('001号同学的选课门数为:'||Fs2('001'));
    end if;
    if(Fs2('018')=-1)then
        dbms_output.put_line('018号同学不存在。');
    else 
        dbms_output.put_line('018号同学的选课门数为:'||Fs2('018'));
    end if;
    if(Fs2('123')=-1)then
        dbms_output.put_line('123号同学不存在。');
    else 
        dbms_output.put_line('123号同学的选课门数为:'||Fs2('123'));
    end if;
end;


--***********End*******************************************
/
存储过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2TZnJtzO-1609600230328)(C:\Users\1\AppData\Roaming\Typora\typora-user-images\image-20201217103718177.png)]


--***********1、完成存储过程的创建*****************
create or replace procedure Ps1(vcname varchar)
is 
vcno course.cno%type;
v_rc sys_refcursor;
r_sc sc%rowtype;
vgrade int;
begin
  select cno into vcno from course where cname = vcname;
  open v_rc for select * from sc where cno=vcno order by 1 ;
  fetch v_rc into r_sc;
  dbms_output.put_line(rpad('学号',10)||rpad('课程号',10)||'成绩');
  dbms_output.put_line(rpad('=',25,'='));
  
  while v_rc%found loop
    if(r_sc.grade is null) then
    vgrade := -1;
    else
      vgrade := r_sc.grade;
    end if;
    dbms_output.put_line(rpad(r_sc.sno,10)||rpad(r_sc.cno,10)||vgrade);
    fetch v_rc into r_sc;
  end loop;
    dbms_output.put_line(rpad('=',25,'='));
  close v_rc;
  exception when no_data_found then
    dbms_output.put_line(vcname||'课程不存在。');
    dbms_output.put_line(rpad('=',25,'='));
end Ps1;


--***********End*******************************************
/

--***********完成测试程序*****************
begin 
Ps1('数据库');
Ps1('Oracle');
end;


--***********End*******************************************
/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6wjpc16-1609600230330)(C:\Users\1\AppData\Roaming\Typora\typora-user-images\image-20201217103757212.png)]


--***********1、完成存储过程的创建*****************
create or replace procedure Ps2(vsno student.sno%type,outputs out varchar )
is 
vsdept student.sdept%type;
vsname student.sname%type;
vgrade sc.grade%type;
begin
  begin
    select sname,sdept into vsname,vsdept from student where sno=vsno;
    exception when no_data_found then
      outputs:=vsno||'号同学不存在。';
      return;
  end;
  select grade into vgrade from sc where sno=vsno and cno=(select cno from course where cname='数据库');
  if(vgrade is null)then
  outputs:=vsname||'同学的系别为:'||vsdept||',数据库的成绩为:未考试';
  return;
  end if;
  commit;
  outputs:=vsname||'同学的系别为:'||vsdept||',数据库的成绩为:'||vgrade;
  exception when no_data_found then
    if(vsdept='CS')then
    outputs:='已成功为'||vsname||'同学选择了数据库课程。';
    else
      outputs:=vsname||'同学没有选择数据库课程。';
    end if;
end;

--***********End*******************************************
/

--***********完成测试程序*****************
declare
outputs varchar(1000);
begin
Ps2('002',outputs);
dbms_output.put_line(outputs);
Ps2('003',outputs);
dbms_output.put_line(outputs);
Ps2('004',outputs);
dbms_output.put_line(outputs);
Ps2('040',outputs);
dbms_output.put_line(outputs);
end;


--***********End*******************************************
/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nk9q9dHA-1609600230331)(C:\Users\1\AppData\Roaming\Typora\typora-user-images\image-20201217103844683.png)]


--***********1、完成存储过程的创建*****************
create or replace procedure Ps3(vsname varchar,vcname varchar,vgrade int,outputs out varchar)
is
psno student.sno%type;
pcno course.cno%type;
begin
  if(vgrade<0 or vgrade>100) then
    outputs:='成绩必须在0到100分之间。';
    return;
  end if;
  begin
    select sno into psno from student where sname=vsname;
    exception when no_data_found then
      outputs:=vsname||'同学不存在。';
      return;
  end;
  begin
    select cno into pcno from course where cname=vcname;
    exception when no_data_found then
      outputs:=vcname||'课程不存在。';
      return;
  end;
  update sc set grade=vgrade where sno=psno and cno=pcno;
  if(vgrade is null)then
  outputs:='已将'||trim(psno)||'号同学'||vcname||'课程的成绩改为未考试';
  commit;
  return;
  end if;
  outputs:='已将'||trim(psno)||'号同学'||vcname||'课程的成绩改为'||vgrade;
  if(sql%rowcount=0)then
  insert into sc values(psno,pcno,vgrade);
  outputs:='已经成功为'||trim(psno)||'号同学选择了'||vcname||'课程,成绩为'||vgrade;
  commit;
  return;
  end if;
end Ps3;

--***********End*******************************************
/

--***********完成测试程序*****************
declare
result varchar(1000);
begin
Ps3('符志阶','数据库',86,result);
dbms_output.put_line(result);
Ps3('符志阶','数据库',null,result);
dbms_output.put_line(result);
Ps3('符志阶s','数据库',86,result);
dbms_output.put_line(result);
Ps3('符志阶','数据库s',86,result);
dbms_output.put_line(result);
Ps3('符志阶','数据库',120,result);
dbms_output.put_line(result);

end;


--***********End*******************************************
/

将’||trim(psno)||‘号同学’||vcname||‘课程的成绩改为未考试’;
commit;
return;
end if;
outputs:=‘已将’||trim(psno)||‘号同学’||vcname||‘课程的成绩改为’||vgrade;
if(sql%rowcount=0)then
insert into sc values(psno,pcno,vgrade);
outputs:=‘已经成功为’||trim(psno)||‘号同学选择了’||vcname||‘课程,成绩为’||vgrade;
commit;
return;
end if;
end Ps3;

End********************************
/

完成测试程序******
declare
result varchar(1000);
begin
Ps3(‘符志阶’,‘数据库’,86,result);
dbms_output.put_line(result);
Ps3(‘符志阶’,‘数据库’,null,result);
dbms_output.put_line(result);
Ps3(‘符志阶s’,‘数据库’,86,result);
dbms_output.put_line(result);
Ps3(‘符志阶’,‘数据库s’,86,result);
dbms_output.put_line(result);
Ps3(‘符志阶’,‘数据库’,120,result);
dbms_output.put_line(result);

end;

End********************************
/


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值