学习大数据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

下一阶段预告

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值