Oracle练习第11周

(括号的表解释说明)

一.单选题

1,

以下哪种程序单元必须返回数据?    

(10.0分)
  • 存储过程

     
  • 函数

     
  • 触发器

     
  •  
 
2,

当建立存储过程时,以下哪个关键字用来定义输出型参数?

(10.0分)
  • in

     
  • procedure

     
  • out

     
  • function

     
 
3,

下列哪个语句可以SQL Plus中直接调用一个存储过程?

(10.0分)
  • return    

     
  • exec

     
  • set

     
  • in

     
 
4,

下面哪些不是存储过程中参数的有效模式?

(10.0分)
  • in

     
  • out 

     
  • out in 

     
  • in out 

     
 
5,

函数头部中的return语句作用是什么?

(10.0分)
  • 声明返回的数据类型

     
  • 调用函数

     
  • 调用过程

     
  • 函数头部不能使用return语句

     
 

二.简答题(共4题,50.0分)

1,

索引有哪些类型?什么情况下适合建立位图索引

(12.5分)(仅参考)
 标准:
 1. b-tree索引 Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。
 2. 位图索引(bitmap index) 位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况。
 3. 基于函数的索引 比如经常对某个字段做查询的时候是带函数操作的,那么此时建一个函数索引就有价值了。
 4. 分区索引和全局索引 这2个是用于分区表的时候。前者是分区内索引,后者是全表索引
 5. 反向索引(REVERSE) 这个索引不常见,但是特定情况特别有效,比如一个varchar(5)位字段(员工编号)含值 (10001,10002,10033,10005,10016..) 这种情况默认索引分布过于密集,不能利用好服务器的并行 但是反向之后10001,20001,33001,50001,61001就有了一个很好的分布,能高效的利用好并行运算。
 6.HASH索引 位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种类型不适合用位图索引。 位图索引适合静态数据,而不适合索引频繁更新的列。 举个例子,有这样一个字段busy,记录各个机器的繁忙与否,当机器忙碌时,busy为1,当机器不忙碌时,busy为0。 这个时候有人会说使用位图索引,因为busy只有两个值。好, 我们使用位图索引索引busy字段!假设用户A使用update更新某个机器的busy值,比如update table set table.busy=1 where rowid=100;,但还没有commit,而用户B也使用update更新另一个机器的busy值,update table set table.busy=1 where rowid=12; 这个时候用户B怎么也更新不了,需要等待用户A commit。

我的答案:

(答了位图索引的建立)

2,

简述同义词和序列的概念?序列常用的两个运算符是

(12.5分) (仅参考)
标准:
 同义词的概念 Oracle数据库中提供了同义词管理的功能。 同义词 是数据库方案对象的一个别名 ,经常用于 简化对象访问 和提高对象访问的安全性。在使用同义词时,Oracle数据库将它 翻译成对应方案对象的名字 。 与视图类似,同义词 并不占用实际存储空间,只有在数据字典中保存了同义词的定义 。在Oracle数据库中的大部分数据库对象,如表、视图、序列、存储过程、包等等,数据库管理员都可以根据实际情况为他们定义同义词。 Oracle同义词的分类 ,分别是 公用public同义词 与 私有同义词
 序列的概念: 序列(Sequence)是用来生成连续的整数数据的对象。它常常用来作为主键的增长列,可以升序,也可以降序。 
用户可以使用nextval和currval两个运算符访问序列的值。nextval将返回序列生成的下一个值,currval将返回序列的当前值。第一次使用序列时,需要使用nextval,此时返回的是初始值。以后再使用nextval运算符,序列会自动增加increment by后面的值。 5. 修改其他方案中的序列时,用户必须具有alter any sequence系统权限。
 
3,

编写过程,实现交换两个变量的值的功能。并输出交换前和交换后的两个值。(in out参数)

(12.5分)
标准:

创建过程
create or replace procedure swap(
num1 in out number,
num2 in out number)
is z number(5);
begin
z:=num1;
num1:=num2;
num2:=z;
end swap;
/
调用
declare
x number:=10;
y number:=20;
begin
dbms_output.put_line('交换前x和y的值是:'||x||'  '||y);
swap(x,y);
dbms_output.put_line('交换后x和y的值是:'||x||'  '||y);
END;
/

我的答案(具体实现,一步步做的):

创建过程:

可以在plsql调用(结果清晰):

查看结果:

 
4, 

已知emp表和dept表的结构说明如下:

emp员工表

(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)

dept部门表

(deptno部门编号/dname部门名称/loc地点)

工资 = 薪金 + 佣金


创建函数,根据给定的部门编号(提示: 利用&)计算该部门所有职工的平均工资。

(12.5分)

标准:

create or replace function avg_sal(id emp.deptno%type) return number is
avgsal number(7,2);
begin
select avg(sal) into avgsal from emp where deptno = id;
return avgsal;
end;
/

begin
dbms_output.put_line(avg_sal(&deptno));
end;
/

我的答案(具体实现,一步步做的):

创建:

可以在plsql调用(结果清晰):

(这是我的表中的部门编号)

 输入已存在的部门编号(查询一下自己的emp表,dddd):

结果:

经过手工计算器验证后结果是一致的。

原文地址:https://www.cnblogs.com/gongsuiqing/p/12881475.html