复习样题(一)
一、选择题样题:
1.有4条与游标有关的语句,它们在程序中出现的正确顺序是:(B)
1) OPEN abc
2) CURSOR abc IS SELECT ename FROM emp
3) FETCH abc INTO vname
4) CLOSE abc
B
A.1、2、3、4 B.2、1、3、4
C.2、3、1、4 D.1、3、2、4
2.数据库运行在归档模式下,如果发生日志切换,为了保证不覆盖旧的日志信息,系统将启动如下哪个进程?(D)
A.DBWR B.LGWR
C.SMON D.ARCH
D
3.对于ROLLBACK命令,以下准确的说法是:(C)
A.撤销刚刚进行的数据修改操作
B.撤销本次登录以来所有的数据修改
C.撤销到上次执行提交或回退操作的点
D.撤销上一个COMMIT命令
C
4.创建表空间时,可以指定表空间中存储对象的默认存储参数,其中哪个参数用于设置分配给每一个对象的初始区大小(B)
A.NEXT B.INITIAL
C.PCTINCREASE D.MINEXTENTS
B
5.现将CONNECT 角色授予TEXT_ROLE角色,下面哪个语句可以实现(D)
A.GRANT ROLE CONNECT ON TEST_ROLE;
B.GRANT ROLE CONNECT TO TEST_ROLE;
C.GRANT CONNECT ON TEST_ROLE;
D.GRANT CONNECT TO TEST_ROLE;
D
二、填空题样题:
1.Oracle数据库系统的物理存储结构主要有三类文件组成,分别:数据文件和日志文件和控制文件。逻辑存储结构包括oracle 数据块、区、段 和 表空间。
2.SQL*Plus中直接调用过程的关键字是exec;查询中去掉重复的行,必须使用的关键字是distinct;关键字describe可以用来显示表的结构信息。
3.使用EXPORT命令时,可以有3种不同方式导出数据,表方式就是导出一个指定的基本表,包括表的定义和数据及表上的索引、约束等。用户方式是导出一个用户的所有对象,包括表、视图、存储过程、序列等。全数据库方式是导出数据库中所有的对象。
4.在ORACLE数据库中,将权限分为两类即系统权限和对象权限,分别指在系统级控制数据库的存取和使用机制和在模式对象上控制存取和使用的机制。
三、判断题样题
1.INSERT事件触发器中可以使用:old伪记录;DELETE事件触发器中可以使用:new伪记录。 (×)
2.后台进程LGWR的作用是数据库写入程序。 (×)
3.Alter user tempuserIdentified by oracle Default tablespace users Default temporary tablsespace temp Quota 100M on users (×)
4.SQL*PLUS中,显示登录的用户的命令是DESCRIB user。 (×)
5.默认登录Oracle Enterprise Manager Database Control 的端口号是1158。(√)
四、简答题样题:
1.How to connect remote oracle server by SQL*PLUS?Please write down the steps and the operating statements?
配置Net Configuration Assisant
在SQlplus客户端运行conn命令
1.配置Net Configuration Assisant
首先打开Net Configuration Assiant客户端,选择“本地网络服务名配置”。选择所要做的工作,选择“添加”。 输入服务名。 选择通信协议。然后配置主机名和端口号。 最后进行测试。
2.在sqlplus中运行命令
先输入username和password登录sqlplus,然后运行命令conn scott/tiger@orcl (其中scott就是Net Configuration Assistant中配置的orcl实例登录名。)
配置Net Configuration Assisant
在SQlplus客户端运行conn命令
1.配置Net Configuration Assisant
首先打开Net Configuration Assiant客户端,选择“本地网络服务名配置”。选择所要做的工作,选择“添加”。 输入服务名。 选择通信协议。然后配置主机名和端口号。 最后进行测试。
2.在sqlplus中运行命令
先输入username和password登录sqlplus,然后运行命令conn scott/tiger@orcl (其中scott就是Net Configuration Assistant中配置的orcl实例登录名。)
2.What is the difference between procedures and functions in the Oracle database?
存储过程 | 函数 |
用于在数据中完成特定的操作或者任务 | 用于特定的数据 |
程序头部申明procedure | 程序头部申明function |
程序头部申明时不需要描述返回类型 | 程序头部申明时需要描述返回类型,而且PL/SQL至少要包含一个有效的return语句 |
可以使用in/out/ in out | 可以使用in/out/in out |
可作为一个独立的PL/SQL语句来执行 | 不能立即执行,必须作为表达式的一部分 |
可以通过out.int out | 通过return语句返回一个值 |
SQL语句中不得调用任何存储过程 | SQL语句中可以调用函数 |
3.读懂如下程序:
CREATE OR REPLACE FUNCTION ret_deptinfo(
p_deptnodept.deptno%TYPE,p_num OUT NUMBER,p_max OUT NUMBER)
RETURN dept.dname%TYPE
AS
v_dnamedept.dname%TYPE;
BEGIN
SELECT dname INTO v_dname FROM dept WHERE deptno=p_deptno;
SELECT count(*),max(sal) INTO p_num,p_max FROM emp WHERE deptno=p_deptno;
RETURN v_dname;
END ret_deptinfo;
分析程序实现的功能:
按照部门号查询该部门总人数、最高工资,同时返回该部门的部门名称。
4.输入和运行以下程序:
CREATE OR REPLACE TRIGGER CHECK_SAL
BEFORE UPDATE ON emp
FOR EACH ROW
BEGIN
IF :new.job='CLERK' AND (:new.sal<500 OR :new.sal>1000) THEN
RAISE_APPLICATION_ERROR(-20001, '工资修改超出范围,操作取消!');
END IF;
END;
分析程序实现的功能:
为emp表的“CLERK”职位的工资添加约束条件:大于500小于1000
五、设计题样题:
1、创建一个存储过程,以部门号为参数,查询该部门的平均工资,并输出该部门中比平均工资高的员工号、员工名。并且调用该存储过程,要求根据输入部门编号,查询平均工资及输出比平均工资高的员工号、员工名。
CREATE OR REPLACE PROCEDURE show_emp(p_deptnoemp.deptno%TYPE)
AS
v_salemp.sal%TYPE;
BEGIN
SELECT avg(sal) INTO v_sal FROM emp WHERE deptno=p_deptno;
DBMS_OUTPUT.PUT_LINE(p_deptno||' '||'average salary is:' ||v_sal);
FOR v_emp IN (SELECT * FROM emp WHERE deptno=p_deptno AND sal>v_sal) LOOP
DBMS_OUTPUT.PUT_LINE(v_emp.empno||' '||v_emp.ename);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('The department doesn’’t exists!');
END show_emp;
过程调用语句:
declare
vdeptnoemp.detpno%type;
Begin
vdeptno:=&deptno;
show_emp(vdeptno);
End;
CREATE OR REPLACE PROCEDURE show_emp(p_deptnoemp.deptno%TYPE)
AS
v_salemp.sal%TYPE;
BEGIN
SELECT avg(sal) INTO v_sal FROM emp WHERE deptno=p_deptno;
DBMS_OUTPUT.PUT_LINE(p_deptno||' '||'average salary is:' ||v_sal);
FOR v_emp IN (SELECT * FROM emp WHERE deptno=p_deptno AND sal>v_sal) LOOP
DBMS_OUTPUT.PUT_LINE(v_emp.empno||' '||v_emp.ename);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('The department doesn’’t exists!');
END show_emp;
过程调用语句:
declare
vdeptnoemp.detpno%type;
Begin
vdeptno:=&deptno;
show_emp(vdeptno);
End;
2、创建一个函数,以部门号为参数,返回部门名、部门人数及部门平均工资。并且调用该函数,输出所有有员工的部门的名称、部门人数和平均工资。
CREATE OR REPLACE FUNCTION ret_deptinfo(p_deptnodept.deptno%TYPE,
p_num OUT NUMBER, p_avg OUT NUMBER)
RETURN dept.dname%TYPE
AS
v_dnamedept.dname%TYPE;
BEGIN
SELECT dname INTO v_dname FROM dept WHERE deptno=p_deptno;
SELECT count(*),avg(sal) INTO p_num,p_avg FROM emp WHERE deptno=p_deptno;
RETURN v_dname;
END ret_deptinfo;
函数调用语句:
DECLARE
v_avgsalemp.sal%TYPE;
v_num NUMBER;
v_dnamedept.dname%TYPE;
BEGIN
FOR v_dept IN (SELECT DISTINCT deptno FROM emp) LOOP
v_dname:=ret_deptinfo(v_dept.deptno,v_num,v_avgsal);
DBMS_OUTPUT.PUT_LINE(v_dname||' '||v_maxsal||' '|| v_avgsal||' '||v_num);
END LOOP;
END;
CREATE OR REPLACE FUNCTION ret_deptinfo(p_deptnodept.deptno%TYPE,
p_num OUT NUMBER, p_avg OUT NUMBER)
RETURN dept.dname%TYPE
AS
v_dnamedept.dname%TYPE;
BEGIN
SELECT dname INTO v_dname FROM dept WHERE deptno=p_deptno;
SELECT count(*),avg(sal) INTO p_num,p_avg FROM emp WHERE deptno=p_deptno;
RETURN v_dname;
END ret_deptinfo;
函数调用语句:
DECLARE
v_avgsalemp.sal%TYPE;
v_num NUMBER;
v_dnamedept.dname%TYPE;
BEGIN
FOR v_dept IN (SELECT DISTINCT deptno FROM emp) LOOP
v_dname:=ret_deptinfo(v_dept.deptno,v_num,v_avgsal);
DBMS_OUTPUT.PUT_LINE(v_dname||' '||v_maxsal||' '|| v_avgsal||' '||v_num);
END LOOP;
END;
3、创建学生表student(sno,sname,sex,sage),要求学号sno主键,姓名sname不能重复,性别sex只能是‘男’或者‘女’,年龄sage在15到25之间。创建课程表course(cno,cname),要求课程号cno主键,课程名cname唯一,同时为主键约束列上的唯一性索引设置存储位置和存储参数。创建学生选课表SC(sno,cno,grade),要求成绩grade大于0小于100,有两位小数,sno,cno都是外键,而且sno,cno一起做主键。
CREATE TABLE student(
sno NUMBER(6) CONSTRAINT S_PK PRIMARY KEY,
sname VARCHAR2(20) UNIQUE,
sex CHAR(2) CONSTRAINT S_CK1 CHECK(sex in('男', '女')),
sage NUMBER(6,2) CONSTRAINT S_CK2 CHECK(sage between 15 and 25)
);
CREATE TABLE course(
cno NUMBER(6) PRIMARY KEY,
cname CHAR(20) UNIQUE
USING INDEX TABLESPACE USER
STORAGE(INITIAL 64K NEXT 64K)
);
CREATE TABLE SC(
sno NUMBER(6) REFERENCES student(sno),
cno NUMBER(6) REFERENCES course(cno),
grade NUMBER(5,2)CHECK(grade between 0 and100),
CONSTRAINT SC_PK PRIMARY KEY(sno, cno)
);
CREATE TABLE student(
sno NUMBER(6) CONSTRAINT S_PK PRIMARY KEY,
sname VARCHAR2(20) UNIQUE,
sex CHAR(2) CONSTRAINT S_CK1 CHECK(sex in('男', '女')),
sage NUMBER(6,2) CONSTRAINT S_CK2 CHECK(sage between 15 and 25)
);
CREATE TABLE course(
cno NUMBER(6) PRIMARY KEY,
cname CHAR(20) UNIQUE
USING INDEX TABLESPACE USER
STORAGE(INITIAL 64K NEXT 64K)
);
CREATE TABLE SC(
sno NUMBER(6) REFERENCES student(sno),
cno NUMBER(6) REFERENCES course(cno),
grade NUMBER(5,2)CHECK(grade between 0 and100),
CONSTRAINT SC_PK PRIMARY KEY(sno, cno)
);
4、创建用户user2,口令为user2,默认表空间为USERS,在该表空间的配额为10 MB,初始状态为锁定。创建用户user3,口令为user3,默认表空间为USERS,在该表空间的配额为10 MB,概要文件为example_profile(假设该概要文件已经创建),为用户user2授予CREATE SESSION,CREATE TABLE ,CREATE VIEW系统权限。user2获得权限后,为用户user3授予CREATE TABLE权限。然后回收user2的CREATE TABLE权限。
SQL> conn system/oracle@orcl或者conn / as sysdba仅供参考,正确就行
SQL>CREATE USER user2IDENTIFIED BY user2
DEFAULT TABLESPACE USERS QUOTA 10M ON USERS
ACCOUNT LOCK;
SQL> CREATE USER user3 IDENTIFIED BY user3
DEFAULT TABLESPACE USERS
QUOTA 10M ON USERS
PROFILE example_profile ;
SQL>GRANT CREATE SESSION,CREATE TABLE,CREATE VIEW
TO user2 WITH ADMIN OPTION;
SQL> CONNECT user2/user2 @ORCL
SQL> GRANT CREATE TABLE TO user3;
SQL>conn system/oracle@orcl或者conn / as sysdba
SQL>revoke CREATE TABLE from user2;
SQL> conn system/oracle@orcl或者conn / as sysdba仅供参考,正确就行
SQL>CREATE USER user2IDENTIFIED BY user2
DEFAULT TABLESPACE USERS QUOTA 10M ON USERS
ACCOUNT LOCK;
SQL> CREATE USER user3 IDENTIFIED BY user3
DEFAULT TABLESPACE USERS
QUOTA 10M ON USERS
PROFILE example_profile ;
SQL>GRANT CREATE SESSION,CREATE TABLE,CREATE VIEW
TO user2 WITH ADMIN OPTION;
SQL> CONNECT user2/user2 @ORCL
SQL> GRANT CREATE TABLE TO user3;
SQL>conn system/oracle@orcl或者conn / as sysdba
SQL>revoke CREATE TABLE from user2;
5、使用EXPDP导出scott模式相关数据,并使用IMPDP将刚刚导出的scott模式相关数据导入到system模式,写出核心操作语句。
1、创建DIRECTORY:create directory dir_dp as 'D:/oracle/dir_dp';
2、授权 :Grant read,write on directory dir_dp to scott;
3、执行导出
expdpscott/tiger@orcl schemas=scott directory=dir_dpdumpfile =expdp_test1.dmp logfile=expdp_test1.log;
4、执行导入
impdp system/oracle@orcl directory=dir_dpdumpfile =expdp_test1.dmp remap_schema=scott:systemlogfile=impdp_test1.log;
1、创建DIRECTORY:create directory dir_dp as 'D:/oracle/dir_dp';
2、授权 :Grant read,write on directory dir_dp to scott;
3、执行导出
expdpscott/tiger@orcl schemas=scott directory=dir_dpdumpfile =expdp_test1.dmp logfile=expdp_test1.log;
4、执行导入
impdp system/oracle@orcl directory=dir_dpdumpfile =expdp_test1.dmp remap_schema=scott:systemlogfile=impdp_test1.log;
Oracle期末模拟题
一、选择题:(每题2分,共30分)
1、启动Oracle数据库应该用_____D_____命令。
A.SETUP B.SHUTDOWN C.START D.STARTUP
2、使用ORACLE的_____B_____组件可以创建一个新的数据库。
A.NET MANAGER B.DCBA
C.EMPDP D.DATABASE ADMIN ASSITANT
3、Oracle 安装过程中SID指的是_____A__。
A.系统标示号 B.数据库名 C.用户名 D.用户口令
4、下列哪一项是ORACLE数据库中最小的逻辑存储分配单元?____ C___
A.表空间 B.段 C.盘区 D.数据块
5、删除表中数据的使用____A___命令
A.DELETE B.WHERE
C.INSERT INTO D.UPDATE
6、如果创建表的主键是可以自动编号,则应该为主键设置什么类型的索引?____A______
A.反向键索引 B.B树索引
C.位图索引 D.基于函数据索引
7、当数据库运行在归档模式下时,哪个进程负责系统日志的归档?___ D_______
A.DBWR B.LGWR C.SMON D.ARCH
8、在使用创建行级触发器时,通过使用关键字__ D___可以引用插入更新的数据。
A.FOR EACH B.ON
C.REFERENCING D.NEW
9、为了去除结果集中重复的行,可在SELECT语句中使用下面哪个关键字?_ B________
A.ALL B.DISTINCT C.SPOOL D.HAVING
10、下面哪一个函数可以把一个列中的所有值累加求和?__B_______
A.MAX B.SUM C.COUNT D.AVG
11、在Oracle中,关于触发器的描述正确的是。____D_____
A. 触发器可以删除,但不能禁用 B. 触发器只能用于表
C.触发器可以分为行级和语句级两种 D.触发器是特殊的存储过程
12、下列哪个对象属于模式对象?_____ C__
A. 数据段 B. 盘区 C.表 D.表空间
13、为了减少表中的链接记录和迁移记录,应该增大表中哪一个存储参数?_____A__
A.PCTFREE B.CACHE
C.MAX EXTENTS D.PCTINCREASE
14、如果只需要返回匹配的列,则应当使用哪种连接?____A___
A. 内连接 B. 交叉连接 C. 左连接 D. 全连接
15、在下列模式对象中,哪个对象不会占用实际的存储空间? _______A___
A.视图 B.表 C.索引 D.簇
二、填空题:(每空1 分,共 10 分)
1、使用_____desc_______命令可以显示表结构。
2、在ORACLE的逻辑存储结构中,根据存储数据的类型,可以将段分为___数据段_、索引段、___临时段____、LOB段和回退段。
3、在Oracle系统中,一个模式只能被一个_数据库对象_所拥有,其创建的所有模式对象都保存在自己的模式中。
4、集合运算符____union______实现了集合的并运算。
5、PL/SQL程序块主要包含3个部分:声明部分、___可执行部分_______和_异常处理部分。
6、在众多事务控制语句中,用来撤销事务操作的语句为__rollback 。
7、使用___shutdown_____命令可以关闭Oracle数据库。
8、_____角色________是具有名称的一组相关权限的组合。
三、判断题:(每题 2 分,共 10分)
1.存储空间分配的基本单元是数据块 。 ( √ )
2.一个表空间可以对应多个物理文件//数据文件 ( × )
3.后台进程LGWR的作用是将数据库写入程序。 ( × )
4.Intersect命令主要是实现两个集合的交运算。 ( √ )
5.锁的粒度与数据库系的并发度和并发控制的开销密切有关。锁的粒度越大,数据库中所能使用的资源越多。 ( × )
四、简答题:(每题5分,共20 分)
1、Please describe the physical storage structure and logical storage structure of the ORACLE database.
①逻辑存储结构主要描述Oracle数据库的内部存储结构,即从技术概念上描述在Oracle数据库种如何组织、管理数据.因此,逻辑存储结构是和操作系统平台无关的,是由Oracle数据库创建和管理的.
②Oracle通过表空间(tablespace)方式,将逻辑存储从物理存储中抽象出来。表空间在逻辑上是一个或多个段的集合,在物理上是一个或多个数据文件的集合。如果使用“关系分析”术语,则段和数据文件之间存在多对多关系:可以将一个表分布在多个数据文件中,而一个数据文件也可能包含多个表的一部分。Oracle通过在段和文件之间插入表空间实体,解决这种多对多关系的问题。
①逻辑存储结构主要描述Oracle数据库的内部存储结构,即从技术概念上描述在Oracle数据库种如何组织、管理数据.因此,逻辑存储结构是和操作系统平台无关的,是由Oracle数据库创建和管理的.
②Oracle通过表空间(tablespace)方式,将逻辑存储从物理存储中抽象出来。表空间在逻辑上是一个或多个段的集合,在物理上是一个或多个数据文件的集合。如果使用“关系分析”术语,则段和数据文件之间存在多对多关系:可以将一个表分布在多个数据文件中,而一个数据文件也可能包含多个表的一部分。Oracle通过在段和文件之间插入表空间实体,解决这种多对多关系的问题。
2、Inputing and operating the following code, Analysis of the function of the code.
DECLARE
X NUMBER(7,2);
BEGIN
SELECT sal INTO x FROM emp WHERE empno = 7788;
IF x < 3000 THEN
UPDATE emp SET sal = 3000
WHERE empno = 7788;
END IF;
END;
更新empno为7788的工资,如果工资小于3000,则把该号员工的工资定为3000
DECLARE
X NUMBER(7,2);
BEGIN
SELECT sal INTO x FROM emp WHERE empno = 7788;
IF x < 3000 THEN
UPDATE emp SET sal = 3000
WHERE empno = 7788;
END IF;
END;
更新empno为7788的工资,如果工资小于3000,则把该号员工的工资定为3000
3、请在system模式中建立序列xl,序列起始值是100,步长为1。向system模式下的stu(sno,sname,sage,sex)表中插入一条记录,其中主键sno字段的值来自序列xl,姓名’TOM’,年龄18,性别’男’。
Create table stu
values(sno number(8),sname varchar2,sage number(3),sex varchar2);
Create sequence xl;
Insert into stu values(xl.nextval+100,’tom’,18,’男’);
Create table stu
values(sno number(8),sname varchar2,sage number(3),sex varchar2);
Create sequence xl;
Insert into stu values(xl.nextval+100,’tom’,18,’男’);
- 请简述游标的作用,并说明操作游标的一般过程。
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
过程:
①定义游标
②打开游标
③提取游标数据
④关闭游标
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
过程:
①定义游标
②打开游标
③提取游标数据
④关闭游标
五、程序设计题:(每题10分,共30 分)
1. 根据要求,完成以下题目。注意:通过scott用户下的emp表实现(empno员工号,ename员工名,sal工资,deptno 部门号)。
(1)创建一个存储过程,以部门号为参数,输出该部门的人数。(10分)
Create or replace procedure process(dno number,dept_num out number)
Is
Begin
Select count(*) into dept_num from emp where deptno = dno;
Dbms_output.put_line(dept_num);
End;
Create or replace procedure process(dno number,dept_num out number)
Is
Begin
Select count(*) into dept_num from emp where deptno = dno;
Dbms_output.put_line(dept_num);
End;
- 创建一个函数,以部门号为参数,返回该部门的平均工资。(10分)
Create or replace function get_sal_avg(dept number)
Return number
Is
V_avg number(8,2);
begin
Select avg(sal) into V_sal from emp where deptno = dept;
Return V_sal;
End;
或
Create or replace function get_avg_sal (dept number)
Retuen number
Is
V_sum number(8,2) := 0;
V_count number(8,2) := 0;
Cursor sal_emp is select salary from emp where deptno = dept;
Begin
For c in sal_emp loop
V_sum := V_sum + c.salary;
V_count := V_count + 1;
End loop;
Return V_sum/V_count;
End;
Create or replace function get_sal_avg(dept number)
Return number
Is
V_avg number(8,2);
begin
Select avg(sal) into V_sal from emp where deptno = dept;
Return V_sal;
End;
或
Create or replace function get_avg_sal (dept number)
Retuen number
Is
V_sum number(8,2) := 0;
V_count number(8,2) := 0;
Cursor sal_emp is select salary from emp where deptno = dept;
Begin
For c in sal_emp loop
V_sum := V_sum + c.salary;
V_count := V_count + 1;
End loop;
Return V_sum/V_count;
End;
2. 在SCOTT模式下有两个结构完全相同的表emp和emp_copy。每当向emp表插入一条新的记录时,ORACLE自动将新插入的记录复制到emp_copy表中请创建一个触发器tg_emp_insert实现上述要求的功能。(10分)
(说明:emp表的结构如下:emp(empno,ename,job,depno,sal,hiredate,comm)
create or replace trigger copy_trigger
after
insert on emp
for each row
begin
insert into emp_copy
values(:new.empno,:new.ename,:new.job,:new.depno,:new.sal,:new.hireda te,:new.comm);
end;
create or replace trigger copy_trigger
after
insert on emp
for each row
begin
insert into emp_copy
values(:new.empno,:new.ename,:new.job,:new.depno,:new.sal,:new.hireda te,:new.comm);
end;