友情提示!大数据****精英们!希望你们认真对待每一次测试 ,每次测试结果都会记录到你的实训档案中! 希望也能在每次测试中找出自己的不足之处,且迅速调整自己的学习态度以及学习技巧!不为失败找借口!要为成功找方法!定能收获无限风光!
总分: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分)
99=81 98=72 97=63 96=54 95=45 94=36 93=27 92=18 9*1=9
88=64 87=56 86=48 85=40 84=32 83=24 82=16 81=8
77=49 76=42 75=35 74=28 73=21 72=14 7*1=7
66=36 65=30 64=24 63=18 62=12 61=6
55=25 54=20 53=15 52=10 5*1=5
44=16 43=12 42=8 41=4
33=9 32=6 3*1=3
22=4 21=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
下一阶段预告
版权归原作者 工科小石头 所有, 如有侵权,请联系我们删除。