学习大数据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分)
X
参考答案:
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]