汕尾海湾 发表于 5 天前

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

目录
一、选择题(共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圈
我要累死了,退出
begin

  for i in 1 .. 8

    loop

      dbms_output.put_line('第'||i||'圈');

      if i=2 then

        dbms_output.put_line('我好渴,我要喝水'); 

        elsif i=8 then

          dbms_output.put_line('我要累死了,退出'); 

        end if; 

      end loop;

  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
begin

  for i in reverse 1 .. 9

    loop

      for j in reverse 1 .. i

        loop

          dbms_output.put(i||'*'||j||'='||i*j||' '); 

          end loop;

          dbms_output.put_line(null); 

      end loop;

  end; 3、使用游标属性从emp表中获取工资排名第二到第四名的职员名字(10分)
declare

dsql varchar2(2000):='select ename from(

select dense_rank()over(order by sal desc) r,emp.* from emp)';

v_ename emp.ename%type;

cur sys_refcursor;

begin

  open cur for dsql;

  fetch cur into v_ename;

  while cur%found

    loop

      if cur%rowcount between 2 and 4 then

        dbms_output.put_line(v_ename); 

        end if;

        fetch cur into v_ename;

      end loop;

      close cur;

  end; 4、一万元存款年利率为0.3%,问多久翻倍。(10分)
declare

money number(8,3):=10000; 

ct number(5):=0;

begin

  while money<20000

    loop

      money:=money*1.003;

      ct:=ct+1;

      end loop;

      dbms_output.put_line(ct||'年后翻倍'); 

  end; 5、有一个表A(id,name,age) 和一个表B(id int,v_date date 更新时间, gxls char 更新范例) 如今要求, 当表A的数据变革时,将变革数据的id和更新时间以及更新的范例 加载到表B中,若insert 更新范例为 ‘i’, 若update 更新范例为 ‘u’, 若delete更新范例为 ‘d’ ,使用触发器来完成。 (10分)
create sequence iid

start with 1

increment by 1; 

create or replace trigger t_B

before

insert or update or delete on A

for each row

begin

  if inserting then

    insert into B(id,v_date,gxls) select iid.nextval,sysdate,'i' from dual;

    elsif updating then

      insert into B(id,v_date,gxls) select iid.nextval,sysdate,'u' from dual;

      elsif deleting then

        insert into B(id,v_date,gxls) select iid.nextval,sysdate,'d' from dual;

      end if;

  end; 6、创建一个过程,使用动态游标和动态sql实现,输入工资体现小于该工资内员工信息,没有输入工资体现所有员工信息。(10分)
create or replace procedure p_sal(v_sal in  varchar2)

is

dsql varchar2(2000);

cur sys_refcursor;

v_emp emp%rowtype;

begin

  if v_sal is null then

    dsql:='select * from emp';

    open cur for dsql;

    fetch cur into v_emp;

    while cur%found

      loop

        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); 

         fetch cur into v_emp;

        end loop;

    close cur;

    else 

      dsql:='select * from emp where sal<'||v_sal;

      open cur for dsql;

    fetch cur into v_emp;

    while cur%found

      loop

        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); 

         fetch cur into v_emp;

        end loop;

    close cur;

    end if;

  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分)

参考答案:
create or replace procedure p07
is
cursor cur_resume is select * from resume;
cursor cur_language(idin number) is select * from resume_language where pid=idin;
cursor cur_edu(idin number) is select * from resume_edu where pid=idin;
v_lang varchar2(1000);
v_edu varchar2(1000);
begin
for i in cur_resume
   loop
   for j in cur_language(i.id)
       loop
         v_lang:=v_lang||j.leve||';';
       end loop;
       for k in cur_edu(i.id)
         loop
         v_edu:=v_edu||substr(k.start_time,1,4)||'年'||substr(k.start_time,5,2)||'月到'||
         substr(k.end_time,1,4)||'年'||substr(k.end_time,5,2)||'月'||','||k.edu||','||k.school||';';
         end loop;
         dbms_output.put_line(v_lang);
         dbms_output.put_line(v_edu);
         insert into resume_simple values(i.id,i.title,i.name,i.sex,i.residence,v_lang,v_edu);
         v_lang:='';
         v_edu:='';
   end loop;
end;

call p07() 血压上来了,前面的题1个小时就写完了,剩下1个半小时全在想这题。。。
忘记点复习

游标属性:
游标%found 游标是否还有记载,有返回true,无返回false
游标%notfound 游标是否没有记载,有返回false,无返回true
游标%rowcount 返回从游标中提取的数据行数
游标%isopen 检查游标是否打开,是返回true,否返回false

下一阶段预告

https://i-blog.csdnimg.cn/direct/43f463c82e8d4027b86f9ff3b7e58614.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 学习大数据DAY18 PLSQL最终阶段测试