学习大数据DAY18 PLSQL最终阶段测试

打印 上一主题 下一主题

主题 554|帖子 554|积分 1662

目录
一、选择题(共30分)  
二、解答题(共70分)
忘记点复习
下一阶段预告


友情提示!大数据精英们!盼望你们认真对待每一次测试 ,每次测试结果都会记载到你的实训档案中! 盼望也能在每次测试中找出自己的不足之处,且迅速调解自己的学习态度以及学习本领!不为失败找借口!要为成功找方法!定能收获无穷风光!

总分:100                                                                                                          得分:90

一、选择题(共30分)  

1.在Oracle中,当FETCH语句从游标获得数据时,下面对该动作叙述正确的是(   C  )。
A.游标打开
B.游标关闭
C.当前记载的数据加载到变量中
D.创建变量生存当前记载的数据

2.在以下步伐块中
declare
v_sql varchar2(255);
v_ename number:=‘&姓名’;
v emp%rowtype;
Begin
v_sql :='select * from emp where empno=7369';
execute immediate v_sql into v ;  
dbms_output(v.empno);
end;  
下面形貌正确的是(  A  )
A.声明部分数据范例不匹配
B.v_sql变量赋值部分会报错
C.execute immediate 部分会报错
D.步伐可以或许正常运行后输出员工编号
3.在Oracle中,PL/SQL块中定义了一个带参数的游标:
CURSOR emp_cursor(dnum NUMBER) IS
SELECT sal,comm FROM emp WHERE deptno=dnum;
那么正确打开此游标的语句是(  AD  )。(多选题)
A.OPEN emp_cursor(20)
B.OPEN emp_cursor FOR 20
C.OPEN emp_cursor USING 20
D.FOR rmp_rec IN emp_cursor(20) LOOP … END LOOP

4.在Oracle中,关于PL/SQL下列形貌正确的是(  C   )
A.PL/SQL代表Power Language/SQL
B.PL/SQL不支持面向对象编程
C.PL/SQL块包罗声明部分、可实行部分和非常处理部分
D.PL/SQL提供的四种内置数据范例是character,integer,float,boolean

5.在Oracle中,阅读下列PL/SQL块:
DECLARE
v_lower NUMBER:=2;
v_upper NUMBER:=100;
v_count NUMBER:=1;
BEGIN
FOR i IN v_lower..v_lower LOOP
INSERT INTO test(results)
VALUES (v_count);
v_count := v_count +1;
ENDLOOP;
END;
请问FOR LOOP循环体实行了(  A  )次
A.1
B.2
C.98
D.100
E.235:

6.在Oracle中,关于循环的形貌不正确的是(  C  )
A.loop循环实用于循环体至少运行一次的循环结构
B.while循环实用于知道明白循环界限的循环结构
C.for循环不实用于递减的循环结构
D.for循环不实用于每次递增大于1的步进循环结构

7.在Oracle中,关于触发器的形貌正确的是(   D )
A.触发器可以删除,但不能禁用
B.触发器只能用于表
C.dml触发器只能用于视图
D.触发器可以insert、update、delete时触发

8.在Oracle中,用下列语句定义了一个过程:
CREATE OR REPLACE PROCEDURE test(a IN VARCHAR2,
b IN OUT NUMBER,
c OUT VARCHAR2) IS
BEGIN
……
END;
/
假定使用的变量都已定义,下面对过程test的调用语法正确的是(  C  )
A.test(‘a’,50,v_str2)
B.test(v_str1,v_num1,‘a’)
C.test(‘a’,v_num1,v_str2)
D.test(v_str1,20,v_str2)

9.在Oracle中,关于包的形貌不正确的是(   B )
A.包是一种数据库对象
B.包具有信息不安全
C.包具有信息隐蔽
D.包具有信息复用

10.在Oracle中,INSTEAD OF触发器主要用于( C   )
A.表
B.事务
C.基于视图
D.基于索引


二、解答题(共70分)

1、模拟活动赛,一共10圈,跑到两圈要喝水,跑到第八圈要退出,运行输出结果如下:(10分)

第1圈

第2圈

我好渴,我要喝水

第3圈

第4圈

第5圈

第6圈

第7圈

第8圈

我要累死了,退出

  1. begin
  2.   for i in 1 .. 8
  3.     loop
  4.       dbms_output.put_line('第'||i||'圈');
  5.       if i=2 then
  6.         dbms_output.put_line('我好渴,我要喝水'); 
  7.         elsif i=8 then
  8.           dbms_output.put_line('我要累死了,退出'); 
  9.         end if; 
  10.       end loop;
  11.   end;
复制代码
 
2、写一个PLSQL代码块打印99乘法表格式如下:(10分)
9*9=81 9*8=72 9*7=63 9*6=54 9*5=45 9*4=36 9*3=27 9*2=18 9*1=9
8*8=64 8*7=56 8*6=48 8*5=40 8*4=32 8*3=24 8*2=16 8*1=8
7*7=49 7*6=42 7*5=35 7*4=28 7*3=21 7*2=14 7*1=7
6*6=36 6*5=30 6*4=24 6*3=18 6*2=12 6*1=6
5*5=25 5*4=20 5*3=15 5*2=10 5*1=5
4*4=16 4*3=12 4*2=8  4*1=4
3*3=9  3*2=6  3*1=3
2*2=4  2*1=2
1*1=1
  1. begin
  2.   for i in reverse 1 .. 9
  3.     loop
  4.       for j in reverse 1 .. i
  5.         loop
  6.           dbms_output.put(i||'*'||j||'='||i*j||' '); 
  7.           end loop;
  8.           dbms_output.put_line(null); 
  9.       end loop;
  10.   end;
复制代码
3、使用游标属性从emp表中获取工资排名第二到第四名的职员名字(10分)
  1. declare
  2. dsql varchar2(2000):='select ename from(
  3. select dense_rank()over(order by sal desc) r,emp.* from emp)';
  4. v_ename emp.ename%type;
  5. cur sys_refcursor;
  6. begin
  7.   open cur for dsql;
  8.   fetch cur into v_ename;
  9.   while cur%found
  10.     loop
  11.       if cur%rowcount between 2 and 4 then
  12.         dbms_output.put_line(v_ename); 
  13.         end if;
  14.         fetch cur into v_ename;
  15.       end loop;
  16.       close cur;
  17.   end;
复制代码
4、一万元存款年利率为0.3%,问多久翻倍。(10分)
  1. declare
  2. money number(8,3):=10000; 
  3. ct number(5):=0;
  4. begin
  5.   while money<20000
  6.     loop
  7.       money:=money*1.003;
  8.       ct:=ct+1;
  9.       end loop;
  10.       dbms_output.put_line(ct||'年后翻倍'); 
  11.   end;
复制代码
5、有一个表A(id,name,age) 和一个表B(id int,v_date date 更新时间, gxls char 更新范例) 如今要求, 当表A的数据变革时,将变革数据的id和更新时间以及更新的范例 加载到表B中,若insert 更新范例为 ‘i’, 若update 更新范例为 ‘u’, 若delete更新范例为 ‘d’ ,使用触发器来完成。 (10分)
  1. create sequence iid
  2. start with 1
  3. increment by 1; 
  4. create or replace trigger t_B
  5. before
  6. insert or update or delete on A
  7. for each row
  8. begin
  9.   if inserting then
  10.     insert into B(id,v_date,gxls) select iid.nextval,sysdate,'i' from dual;
  11.     elsif updating then
  12.       insert into B(id,v_date,gxls) select iid.nextval,sysdate,'u' from dual;
  13.       elsif deleting then
  14.         insert into B(id,v_date,gxls) select iid.nextval,sysdate,'d' from dual;
  15.       end if;
  16.   end;
复制代码
6、创建一个过程,使用动态游标和动态sql实现,输入工资体现小于该工资内员工信息,没有输入工资体现所有员工信息。(10分)
  1. create or replace procedure p_sal(v_sal in  varchar2)
  2. is
  3. dsql varchar2(2000);
  4. cur sys_refcursor;
  5. v_emp emp%rowtype;
  6. begin
  7.   if v_sal is null then
  8.     dsql:='select * from emp';
  9.     open cur for dsql;
  10.     fetch cur into v_emp;
  11.     while cur%found
  12.       loop
  13.         dbms_output.put_line(v_emp.empno||' '||v_emp.ename||' '||v_emp.job||' '||v_emp.mgr||' '||v_emp.hiredate||' '||v_emp.sal||' '||v_emp.comm||' '||v_emp.deptno); 
  14.          fetch cur into v_emp;
  15.         end loop;
  16.     close cur;
  17.     else 
  18.       dsql:='select * from emp where sal<'||v_sal;
  19.       open cur for dsql;
  20.     fetch cur into v_emp;
  21.     while cur%found
  22.       loop
  23.         dbms_output.put_line(v_emp.empno||' '||v_emp.ename||' '||v_emp.job||' '||v_emp.mgr||' '||v_emp.hiredate||' '||v_emp.sal||' '||v_emp.comm||' '||v_emp.deptno); 
  24.          fetch cur into v_emp;
  25.         end loop;
  26.     close cur;
  27.     end if;
  28.   end;
复制代码
7、有一张简历表resume生存了简历的根本信息;表resume_language生存了语言本领信息;表resume_edu生存了教导履历信息,表字段说明如下:
resume表
id(简历id)
title(简历名称)
name(姓名)
sex(姓别)
residence(籍贯)
resume_language表
id(主键)
pid(所属的简历id)
level(语言等级,比如英语6级)
resume_edu表
id(主键)
pid(所属简历id)
edu(学历)
school(学校名)
start_time入学时间
end_time(毕业时间)
如今有一张简历信息汇总表resume_simple,表字段如下:
resume_simple表
id(简历id)
title(简历名称)
name(姓名)
sex(姓别)
residence(籍贯)
language(语言本领)
education(教导履历)
要求:写一个存储过程,将resume、resume_language、resume_edu三张表的数据汇总到resume_simple表中。注:resume_smiple表中language字段存储格式为:英语6级;法语4级...(每个人可能有多种语言本领,每种之间用;号隔开);education字段存储格式为:1990年09月到1993年07月,高中,学校;1993年09月到1997年,大学,学校名称;...(每个教导履历都是由入学时间、毕业时间、学历、学校组成,每个教导履历之间用;号隔开)(10分)

参考答案:
  1. create or replace procedure p07
  2. is
  3.   cursor cur_resume is select * from resume;
  4. cursor cur_language(idin number) is select * from resume_language where pid=idin;
  5. cursor cur_edu(idin number) is select * from resume_edu where pid=idin;
  6. v_lang varchar2(1000);
  7. v_edu varchar2(1000);
  8. begin
  9. for i in cur_resume
  10.    loop
  11.      for j in cur_language(i.id)
  12.        loop
  13.          v_lang:=v_lang||j.leve||';';
  14.        end loop;
  15.        for k in cur_edu(i.id)
  16.          loop
  17.            v_edu:=v_edu||substr(k.start_time,1,4)||'年'||substr(k.start_time,5,2)||'月到'||
  18.            substr(k.end_time,1,4)||'年'||substr(k.end_time,5,2)||'月'||','||k.edu||','||k.school||';';
  19.          end loop;
  20.          dbms_output.put_line(v_lang);
  21.          dbms_output.put_line(v_edu);
  22.          insert into resume_simple values(i.id,i.title,i.name,i.sex,i.residence,v_lang,v_edu);
  23.          v_lang:='';
  24.          v_edu:='';
  25.    end loop;
  26. end;
  27. call p07()
复制代码
血压上来了,前面的题1个小时就写完了,剩下1个半小时全在想这题。。。
忘记点复习

游标属性:

游标%found 游标是否还有记载,有返回true,无返回false

游标%notfound 游标是否没有记载,有返回false,无返回true

游标%rowcount 返回从游标中提取的数据行数

游标%isopen 检查游标是否打开,是返回true,否返回false


下一阶段预告



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表