一、选择题
1、关于SQL、SQL*Plus、PL/SQL相关于Oracle数据库的说法不正确的是(D )
A.SQL是用来和Oracle交互的工具
B.SQL*Plus是编写SQL和PL/SQL的工具
C.PL/SQL是Oracle提供的过程化语言
D.SQL*PLUS中不能含有SQL语句
2、ORACLE中权限最大的用户是(C)
A. system
B. admin
C. sys
D. scott
3、select ename from emp where job=’SALESMAN’ order by empno desc 的第三条结果是(D )
A. ALLEN
B. KING
C. SMITH
D. WARD
4、执行语句select gongda from emp的执行结果是(D)
A. 显示gongda
B. 无输出
C. 显示14行工大
D. 报异常
5、执行语句select * from emp where job=’clerk’,得到的结果是(B)
A. 输出4行结果
B. 无输出
C. 输出14行结果
D. 报异常
6、PL/SQL中自定义异常编号正确的是(B)
A. -01400
B. -20222
C. -01158
D. -1433
7、PL/SQL中,若一条select语句没有返回值,将引发哪个异常(B)
A.NO_ROWS_FOUND
B.NO_DATA_FOUND
C.NO_DATA_ROWS _FOUND
D.NO_FIND
8、以下代码哪一行有问题(B)
1 DECLARE
2 v_i NUMBER := &n ;
3 BEGIN
4 IF v_i % 3 = 0 THEN
5 dbms_output.put_line('您输入的数字是:'||v_i||'可以被3整除');
6 ELSE
7 dbms_output.put_line('您输入的数字是:'||v_i||'不能被3整除');
8 END IF ;
9 END;
A. 第2行
B. 第4行
C. 第6行
D. 哪一行都没错
9、有一段PL/SQL程序如下所示:
var1 := 10;
LOOP
EXIT WHEN var1 > 12;
var1 := var1 +1;
DBMS_OUTPUT.PUT_LINE(‘A’);
.- 1 -
END LOOP;
输出的结果为(C )
A.无输出
B.A
C.A
A
D.A
A
A
10、以下程序执行后的结果是( B )
DECLARE
str1 VARCHAR2(4000):='abcdefg_hijklmn'; --g和h之间的下划线代表此处有一个空格 str2 VARCHAR2(4000);
str3 VARCHAR2(4000);
BEGIN
select upper(str1) into str2 from dual;
select LENGTH(str1) into str3 from dual;
dbms_output.put_line(str2||', '||str3);
END;
A.无输出
B.ABCDEFG HIJKLMN, 15
C.ABCDEFG HIJKLMN, 14
D.abcdefg hijklmn,15
11、ORACLE中权限最大的用户是(C)
A. system
B. admin
C. sys
D. scott
12、oracle 11g默认的日期格式是(A)
A. 25-12月-2013
B. 2013-12-25
C. 12-25-2013
D. 25-12-2013
13、执行语句SELECT comm FROM EMP 的执行结果有数字显示的是( A )
A. 4行
B. 无输出
C. 14行
D. 报错
14、如何获得系统当前时间(C)
A.sysdate
B.select sysdate
C.select sysdate from dual
D.以上都是
15、执行语句select * from emp where job=’clerk’,得到的结果是(B)
A. 输出4行结果
B. 无输出
C. 输出14行结果
D. 报错
16、emp中,deptno是该表的( B )
A. 主键
B. 外键
C. 什么都不是
D. 主键+外键
17、PL/SQL中自定义异常编号正确的是(B)
A. -01400
B. -20123
C. -01158
D. -1433
18、PL/SQL中,若一条select语句没有返回值,将引发哪个异常(B)
A.NO_ROWS_FOUND
B.NO_DATA_FOUND
C.NO_DATA_ROWS _FOUND
D.NO_FIND
19、有一段PL/SQL程序如下所示:
var1 := 10;
LOOP
EXIT WHEN var1 > 12;
var1 := var1 +1;
DBMS_OUTPUT.PUT_LINE(‘A’);
END LOOP;
输出的结果为(C )
A.无输出
B.A
C.A
A
D.A
A
A
20、在 Oracle PL/SQL程序中,要从用户输入赋值给数字变量 stuid,下面代码正确的是(C)
A.stuid = ‘& stuid ’
B.stuid := “& stuid ”
C.stuid : = & stuid
D.stuid = & stuid
二、简答题
1、查询出名字中第三个字母是“N”的员工信息
select * from emp where ename like ‘__N%’
2、查询所有员工工号、姓名、工资、所在部门名称、所在地,按工资降序排列
select emp.empno,emp.ename,emp.sal,dept.dname,dept.loc from emp,dept
where emp.deptno=dept.deptno order by emp.sal
3、查询每个部门的员工数量以及该部门名称,将员工数大于4人的部门筛选出来
select dname,count(*) from scott.emp,scott.dept
WHERE scott.emp.deptno=scott.dept.deptno
group by dname HAVING count(*)>4
4、查询出没有员工的部门信息(部门编号、名称、所在地)
SELECT * FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp)
5、查询出工资总数最少部门的部门信息(部门编号、名称、所在地)
select * FROM (select dept.deptno,dept.dname,dept.loc,sum(sal)
from emp,dept
WHERE emp.deptno=dept.deptno
group by
dept.deptno,dept.dname,dept.loc
order by sum(sal)) where rownum<2
6、将所有芝加哥工作的人工资加500,奖金加100
UPDATE emp SET sal=sal+500 , comm=nvl(comm,0)+100
WHERE emp.deptno=(SELECT deptno FROM dept WHERE loc='CHICAGO' )
7、查询所有员工工号、姓名、工资
select emp.empno,emp.ename,emp.sal from emp
8、查询出每个员工姓名、工资,并按工资降序排列
select ename,sal from emp order by sal desc
9、查询出每个员工的姓名以及部门所在地
select emp.ename,dept.dname FROM emp,dept where emp.deptno=dept.deptno
10、查询出工资总数最少部门的部门信息(部门编号、名称、所在地)
select * FROM (select dept.deptno,dept.dname,dept.loc,sum(sal)
from emp,dept
WHERE emp.deptno=dept.deptno
group by
dept.deptno,dept.dname,dept.loc
order by sum(sal)) where rownum<2
11、将所有在纽约工作的人工资加500,奖金加100
UPDATE emp SET sal=sal+500 , comm=nvl(comm,0)+100
WHERE emp.deptno=(SELECT deptno FROM dept WHERE loc='NEW YORK' )
12、删除工资最高的两个员工信息
delete from scott.emp where sal in( SELECT sal FROM (SELECT * FROM scott.emp ORDER BY sal desc) WHERE ROWNUM < 3 )
三、编程题
1、自定义输入任意员工编号,输出该员工编号、姓名、工资、部门名称、所在地,如果输入的编号错误,请进行异常处理。
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_dname dept.dname%TYPE;
v_loc dept.loc%TYPE;
BEGIN
v_empno :=&gh;
SELECT empno,ename,sal,dname,loc INTO v_empno,v_ename,v_sal,v_dname,v_loc
FROM emp,dept WHERE emp.deptno=dept.deptno AND empno=v_empno;
dbms_output.put_line('工号'||v_empno||',姓名: '||v_ename||',sal:'||v_sal||',dname:'||v_dname||',loc:'||v_loc);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('该员工号不存在!');
END;
2、自定义输入部门编号,查询出该部门编号下所有员工信息(姓名、工资、部门编号),并显示信息条数。 DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_deptno emp.deptno%TYPE:=&kkk;
CURSOR c_1 IS SELECT emp.ename,emp.sal,emp.deptno FROM emp WHERE deptno=v_deptno;
BEGIN
OPEN c_1;
LOOP
FETCH c_1 INTO v_ename,v_sal,v_deptno;
IF c_1%FOUND THEN
dbms_output.put_line('姓名:'||v_ename||'工资:'||v_sal||'部门编号:'||v_deptno); ELSE
dbms_output.put_line('查询完毕!');
dbms_output.put_line('共有:'||c_1%ROWCOUNT||'条记录');
EXIT;
END IF;
END LOOP;
CLOSE c_1;
END;
3、编写一个触发器,实现CLERK的工资只能涨不能降,奖金只能涨不能降,
同时也不能删除CLERK人员的信息
CREATE OR REPLACE TRIGGER bbbb
BEFORE DELETE OR UPDATE OF sal,comm
ON scott.emp
FOR EACH ROW
WHEN (old.job='CLERK')
BEGIN
CASE
WHEN updating('sal') THEN
IF :new.sal < ld.sal THEN
raise_application_error(-20111,'CLERK人员工资只能涨不能降');
END IF;
WHEN updating('comm') THEN
IF :new.comm < ld.comm THEN
raise_application_error(-20222,'CLERK人员奖金只能涨不能降');
END IF;
WHEN deleting THEN
raise_application_error(-20333,'CLERK人员信息不允许删除');
END CASE;
END;
4、创建一个存储过程,实现:通过输入员工编号查看员工姓名、工资、奖金;如果输入的编号不存在,进行异常处理;如果工资高于4000,进行异常处理;如果奖金没有或为空,进行异常处理.
CREATE OR REPLACE PROCEDURE yuangonginfo(v_no IN NUMBER)
AS
v_comm NUMBER;
v_sal emp.sal%TYPE;
BEGIN
SELECT emp.comm,emp.sal INTO v_comm,v_sal FROM emp WHERE emp.empno=v_no;
IF v_sal > 4000 THEN
RAISE_application_error(-20123,'该员工工资4000太高了,裁员第一个考虑');
END IF;
IF v_comm IS NULL OR v_comm = 0 THEN
RAISE_application_error(-20111,'该员工没有奖金啊!');
END IF;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('您输入的员工编号不存在!');
END yuangonginfo;
5、编写一个PL/SQL程序执行第一题(自定义输入员工编号),捕获第一题(1.2、1.3)抛出的异常,换个提示输出到屏幕上.
declare
a12 exception;
a13 exception;
v_no NUMBER;
pragma exception_init(a12,-20123);
pragma exception_init(a13,-20111);
BEGIN
v_no := &n ;
yuangonginfo(v_no);
exception
when a12 then
dbms_output.put_line('该员工工资居然有4000,靠!');
when a13 then
dbms_output.put_line('该员工没有奖金,要给该员工加奖金了!');
end;
6、向dept表中插入10条数据,deptno从51开始,dname从dn51开始,loc从loc51开始
DECLARE
v_counter NUMBER := 1;
v_deptno dept.deptno%TYPE := '50';
v_dname dept.dname%TYPE;
v_dname1 dept.dname%TYPE := 'dn';
v_loc dept.loc%TYPE ;
v_loc1 dept.loc%TYPE := 'loc';
BEGIN
WHILE v_counter <= 10 LOOP
v_counter := v_counter + 1;
v_deptno := v_deptno + 1;
v_dname := v_dname1|| v_deptno;
v_loc := v_loc1 || v_deptno;
INSERT INTO dept VALUES(v_deptno,v_dname,v_loc) ;
END LOOP;
END;
7、编写一个PL/SQL程序,对所有的salesman增加奖金(comm)500,clerk增加600,最终显示员工姓名、工作种类、原奖金、现奖金。
DECLARE
CURSOR c IS SELECT ename,job,comm,nvl(comm,0) FROM scott.emp ;
v_comm scott.emp.comm%TYPE;
v_comm2 scott.emp.comm%TYPE;
v_comm3 scott.emp.comm%TYPE;
v_job scott.emp.job%TYPE;
v_ename scott.emp.ename%TYPE;
BEGIN
FOR i IN c LOOP
v_ename := i.ename;
v_job := i.job;
v_comm := i.comm;
IF v_job='MANAGER' THEN
UPDATE scott.emp SET scott.emp.comm=nvl(scott.emp.comm,0) + 500 WHERE scott.emp.ename=v_ename; v_comm2 := nvl(v_comm,0) + 500;
dbms_output.put_line(v_ename||'的工种是'||v_job||',原奖金是'||v_comm||',现奖金是: '||v_comm2);
ELSIF v_job='CLERK' THEN
UPDATE scott.emp SET scott.emp.comm=nvl(scott.emp.comm,0) + 600 WHERE scott.emp.ename=v_ename; v_comm3 := nvl(v_comm,0) + 600;
dbms_output.put_line(v_ename||'的工种是'||v_job||',原奖金是'||v_comm||',现奖金是: '||v_comm3);
END IF;
END LOOP;
END;
8、编写一个触发器,实现级联更新,在修改了dept表中的deptno之后,级联、自动修改emp表中的deptno CREATE OR REPLACE TRIGGER aaaa
AFTER UPDATE OF deptno
ON scott.dept
FOR EACH ROW
BEGIN
UPDATE scott.emp SET scott.emp.deptno= :new.deptno
WHERE deptno = old.deptno;
END;
9、创建一个存储过程,实现:通过输入员工编号查看员工姓名、工资、奖金;如果输入的编号不存在,进行异常处理;如果工资高于4000,进行异常处理;如果奖金没有或为空,进行异常处理.
CREATE OR REPLACE PROCEDURE yuangonginfo(v_no IN NUMBER)
AS
v_comm NUMBER;
v_sal emp.sal%TYPE;
BEGIN
SELECT emp.comm,emp.sal INTO v_comm,v_sal FROM emp WHERE emp.empno=v_no;
IF v_sal > 4000 THEN
RAISE_application_error(-20123,'该员工工资4000太高了,裁员第一个考虑');
END IF;
IF v_comm IS NULL OR v_comm = 0 THEN
RAISE_application_error(-20111,'该员工没有奖金啊!');
END IF;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('您输入的员工编号不存在!');
END yuangonginfo;
10、编写一个PL/SQL程序,以提升2个入职时间最早的职员为MANAGER
BEGIN
UPDATE scott.emp SET job='MANAGER' WHERE scott.emp.hiredate IN ( SELECT hiredate FROM (SELECT * FROM scott.emp ORDER BY scott.emp.hiredate) WHERE ROWNUM < 3 );
IF SQL%FOUND THEN
dbms_output.put_line('数据更新完毕!共更新'||SQL%ROWCOUNT||'条数据');
END IF;
END;
本文档为【oracle模拟习题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。