当前位置:   article > 正文

oracle期末考试参考答案_检索scott.emp表中职位是salesman(销售员)的记录,并且分行编写sql语句。

检索scott.emp表中职位是salesman(销售员)的记录,并且分行编写sql语句。

刚刚考完,参考答案,欢迎斧正!

A,B相同的准备工作

准备工作: 开两个cmd
其中一个: sqlplus sys/123456 as sysdba;
                  alter user scott account unlock;
另一个:
                  sqlplus scott/tiger;
 

A卷题解

1.请完成以下sqlplus的设置并按要求保存代码和截图(20分,每小题4分)

scott用户下
(1)设置sql的提示符为你的姓名,如张三>>

set sqlprompt 张三>>;


(2)设置每行100个字符,每页18行

  1. set linesize 100
  2. set pagesize 18


(3)查看scott用户的dept表,并将该内容存入my_1.sql;

  1. select * from dept;
  2. save my_1

默认在主目录下,不用写路径


(4)执行my_1.sql文件

@my_1


(5)查看emp表对象的结构信息

desc emp;


2.请完成以下基本操作,并按要求保存代码和截图(此题50分,前4小题每小题5分,第5小题30分)

--sys用户窗口下  方便分辨sys还是普通用户,下面管理员的SQL>提示就不改了
(1)创建一个普通用户,要求以自己的姓名的全拼命名,如:zhangsan,密码为123

create user zhangsan identified by 123;


(2)创建角色student_role,并使之具备创建表、创建视图、创建存储过程、创建触发器的权限

  1. create role student_role;
  2. grant create table,create view,create procedure,create trigger to student_role;


(3)将用户角色student_role和创建会话权限授权给刚建立的用户zhangsan,将查询scott用户下的emp权限授给zhangsan

  1. grant student_role,create session to zhangsan;
  2. grant select on scott.emp to zhangsan;


(4)修改zhangsan用户,让其默认表空间为users,并且表空间配额20m

  1. alter user zhangsan
  2.     default tablespace users
  3.     quota 20m on users;


(5)连接到zhangsan用户,并解锁。并在该用户下完成:

conn zhangsan/123;

①建立数据表stu_emp,stu_dept,要求该表为scott用户下的emp表、dept表的备份
--先要授予对dept表的select权限

grant select on scott.dept to zhangsan;


--复制表 回到zhangsan用户窗口

  1. create table stu_emp as select * from scott.emp;
  2. create table stu_dept as select * from scott.dept;

②查询每位员工的实际工资(工资+津贴)

select ename 姓名,sal+nvl(comm,0) 实际工资 from stu_emp;

③查询比部门号为10号的平均工资高的人数

select count(empno) from stu_emp where sal>(select avg(sal) from stu_emp where deptno=10);

④创建视图view_detaliled,用于查看每个员工的编号,姓名以及所在城市

  1. create view view_detaliled as
  2. select empno,ename,loc from stu_emp,stu_dept
  3. where stu_emp.deptno=stu_dept.deptno;

⑤对视图view_detaliled插入一条数据(1010,jack,北京).若能成功请查询相关数据,若不能成功,说明原因。

insert into view_detaliled values(1010,'jack','北京');

不能插入成功,因为视图一般由多个基表组成的逻辑结构,一般不允许直接进行dml(update,insert,delete)操作。
因为对视图的操作其实是对组成视图的好多个基本表的操作,直接dml操作视图可能破坏表与表之间的完整性约束等。
比如上面的例子,其实是分别向stu_emp插入(1010)和向表stu_dept插入('jack','北京')。很明显,dept表的新插入
记录缺少主键数据,不可能让你插入成功的。
此时想要直接对视图进行dml操作,需要写一个关于该视图的替换触发器,在触发器内实现对各个基本表的dml操作

3.创建一个存储过程stu_proc并执行。要求:以员工编号为参数,返回该员工的姓名和工资,若工资低于3000,则报错,
说明工资低于国家最低工资水平

  1. create procedure stu_proc(
  2.         var_empno in stu_emp.empno%type,
  3.         var_ename out stu_emp.ename%type,
  4.         var_sal out stu_emp.sal%type
  5.     ) as
  6. begin
  7.     select ename,sal into var_ename,var_sal from stu_emp where empno=var_empno;
  8.     if var_sal<3000 then
  9.         dbms_output.put_line('工资低于国家最低工资水平');
  10.     end if;
  11. end;
  12. /

--执行

  1. set serveroutput on;
  2. declare
  3.     var_empno stu_emp.empno%type;
  4.     var_ename stu_emp.ename%type;
  5.     var_sal stu_emp.sal%type;
  6. begin
  7.     var_empno:=&no;
  8.     stu_proc(var_empno,var_ename,var_sal);
  9.     dbms_output.put_line('姓名:'||var_ename||' 工资:'||var_sal);
  10. end;
  11. /


4.声明一个带输入参数(部门号)的显式游标cur_sel,根据参数传递来查询每位员工的姓名和所在城市

  1. declare
  2. cursor cur_sel(var_deptno stu_dept.deptno%type) is
  3. select ename,loc from stu_dept,stu_emp
  4. where stu_dept.deptno=stu_emp.deptno and stu_dept.deptno=var_deptno;
  5. var_no stu_dept.deptno%type;
  6. begin
  7. var_no:=&no;
  8. dbms_output.put_line(var_no||'号员工的相关信息如下');
  9. for emp_record in cur_sel(var_no) loop
  10. dbms_output.put_line(emp_record.ename||'住在'||emp_record.loc);
  11. end loop;
  12. end;
  13. /

考试时不知道时间。。总感觉我们时间分配少了。。做这题时就剩下10min了,急的要死。。然后多写了一个cursor前create,卡住了,竟然当时方的不会改。。差点没完卷,考试提交版本如下:

  1. declare
  2. cursor cur_sel(var_deptno stu_dept.deptno%type) is
  3. select ename,loc from stu_dept,stu_emp
  4. where stu_dept.deptno=stu_emp.deptno and stu_dept.deptno=var_deptno;
  5. begin
  6. for emp_record in cur_sel(10) loop
  7. dbms_output.put_line(emp_record.ename||'住在'||emp_record.loc);
  8. end loop;
  9. end;
  10. /

5.详细阐述oracle的体系结构(10分)

 

B卷题解

1.sqlplus环境设置(20分,每小题4分)
(1)设置每行120个字符,设置每页20行

  1. set linesize 120
  2. set pagesize 20



(2)设置sql的提示符为你的名字,如李四>>

set sqlprompt 李四>>


 

(3)查看scott用户下emp表信息

select * from emp;


 

(4)my.sql文件,实现在scott用户下emp表中查询工作是SALESMAN的所有职工的姓名
工资,要求姓名,工资字段分别格式化成a10,$999,999.00
在D盘根目录下新建文件my.sql 写下如下代码:
--my.sql

  1. col ename for a10
  2. col sal for $999,999.00
  3. select ename,sal from emp where job='SALESMAN';


(5)执行my.sql

@ D:\my


2.请完成以下基本操作,并按要求保存代码和截图(此题50分,每小题5分)
--管理员窗口
(1)创建一个普通用户,要求以自己的姓名的全拼写命名,如:lisi,密码:abc

create user lisi identified by abc;


 

(2)创建角色myrole,并使之具备创建表,创建视图,创建触发器,存储过程的权限

  1. create role myrole;
  2. grant create table,create view,create trigger,create procedure to myrole;


 

(3)将用户角色myrole和连接权限授给刚建立的用户lisi

grant myrole,connect to lisi;


 

(4)将访问scott用户下的emp的权限授权给lisi

grant select on scott.emp to lisi;


 

(5)修改lisi用户,让其默认表空间为users,并且表空间配额5m

  1. alter user lisi 
  2.     default tablespace users
  3.     quota 5m on users;


 

(6)连接到lisi用户,并且在该用户下完成
--普通用户窗口切换到 lisi用户

conn lisi/abc

①建立数据表my_emp/my_dept,分别为scott用户下的emp,dept表的备份
--先要授予对dept表的select权限  sys窗口

grant select on scott.dept to lisi;


 

--复制表 回到lisi用户窗口

  1. create table my_emp as select * from scott.emp;
  2. create table my_dept as select * from scott.dept;

②列出所有"CLERK"(办事员)的姓名及其部门名称

select ename,dname from my_emp,my_dept where my_emp.deptno=my_dept.deptno and job='CLERK';

③列出薪水比"SMITH"多的所有员工

select * from my_emp where sal>(select sal from my_emp where ename='SMITH');

④找出在(任何年份的)2月受聘的所有员工

select * from my_emp where to_char(hiredate,'mm')=2;

⑤查询各种工作的最低工资

select job 工作,min(sal) 最低工资 from my_emp group by job;


 

3.scott模式中使用隐式游标for循环,用于实现根据部门号查询员工姓名和工作(10分)

conn scott/tiger;
  1. set serveroutput on;
  2. declare
  3. var_deptno emp.deptno%type;
  4. begin
  5. var_deptno:=&no;
  6. dbms_output.put_line(var_deptno||'号部门的相关信息如下');
  7. for emp_record in (select ename,job from emp where deptno=var_deptno) loop
  8. dbms_output.put_line('姓名:'||emp_record.ename||' 工作:'||emp_record.job);
  9. end loop;
  10. end;
  11. /



4.写一个pl/sql存储过程。根据scott模式下的emp表,写一个带参数的存储过程proc(deptno in number,sum_sal out number),
输入部门编号,输出该部门的总工资信息,并写一个pl/sql程序块,测试该存储过程(10分)

--过程

  1. create or replace procedure proc(var_deptno in number,sum_sal out number) as
  2. begin
  3. select sum(sal) into sum_sal from emp where deptno=var_deptno;
  4. end;
  5. /

--执行

  1. declare
  2. var_deptno number;
  3. var_sumSal number;
  4. begin
  5. var_deptno:=&no;
  6. proc(var_deptno,var_sumSal);
  7. dbms_output.put_line(var_deptno||'号部门的总工资为:'||var_sumSal);
  8. end;
  9. /

    


5.说明oracle逻辑结构和物理结构的构成

(安工程,依芸芸&李臣龙oracle班)

总的来说。。一如既往。。简单 。。就是有些题意可能有歧义,A卷存储过程那题"以员工编号为参数,返回该员工的姓名和工资,若工资低于3000,"姓名和工资要写成输出参数。。亲口问老师的。。

还有就是时间。。。考完前10分钟才知道总时长只有。。。。。

参考答案,欢迎斧正,给下届乘凉!

还有,以后打死不写学校考试有关的博客了。。。。后辈子弟也不要写了。。太无耻!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/472076
推荐阅读
相关标签
  

闽ICP备14008679号