简介这份Oracle期末复习题PDF面向高校数据库课程学生与备考Oracle认证的初学者聚焦SQLPLUS操作、数据库连接、表空间管理、PL/SQL子程序及网络配置等核心考点帮助读者在考前系统梳理易错概念与高频选择题。资源包内仅含1个PDF文件大小约401KB内容以选择题形式覆盖SQLPLUS工具定位、sqlplus /nolog与CONN命令、DESC查看表结构、SET SERVEROUTPUT ON回显设置、TRUNCATE与DELETE效率对比、PMON资源释放、侦听器位置、逻辑存储结构块区段表空间层级、STARTUP MOUNT启动方式、tnsnames.ora中PORT与SID参数、过程与函数返回值差异、包规范与包体创建等知识点。目前已有253人学习下载适合需要快速自测、查漏补缺的读者可将其作为期末冲刺的题库清单逐题核对概念盲区也可配合教材实验环节验证命令行为提升应试与实操理解效率。1. 从一份 Oracle 期末复习题里我拆出了 DBA 面试的高频考点很多人拿到「Oracle期末复习题.pdf」这类资源第一反应是当题库刷一遍就扔。我最初也这么干直到有次帮朋友复盘一份 DBA 岗面试发现面试官问的启动三阶段、PMON 与 SMON 的分工、truncate 和 delete 的差异几乎和这份复习题里的选择题一模一样。这份 PDF 不是普通题库它把 SQL*PLUS 工具链、实例与数据库的启动关闭、逻辑存储结构、PL/SQL 子程序、网络配置这几条主线用 59 道选择题加填空简答串成了一条完整的知识链。它适合两类人一是正在准备 Oracle 相关课程考试的学生二是想系统梳理 Oracle 基础、准备 DBA 或后端开发面试的从业者。下面我不按题号讲而是按技术模块拆开把每道题背后的原理、可复现的操作和容易翻车的地方讲透。2. SQL*PLUS 工具链从 /nolog 到 SET SERVEROUTPUT ON 的完整操作链SQLPLUS 是 Oracle 客户端访问服务器的一个命令行工具通过它可以向服务器发送 SQL 命令。这句话是复习题第 1 题的正确答案也是理解整个工具链的起点。很多人把 SQLPLUS 和 Oracle 数据库服务器混为一谈实际上它只是客户端工具服务器端跑的是实例和数据库文件。这一章把复习题里涉及 SQL*PLUS 的零散考点串成一条可操作链路。2.1 启动方式与登录/nolog 到底做了什么sqlplus /nolog的作用是启动 SQLPLUS 但不登录数据库这是第 2 题的考点。很多人误以为/nolog是以 nolog 用户身份登录实际上斜杠后面跟的是用户名和密码/nolog是一个独立参数表示不自动连接。常见做法是先用/nolog进入 SQLPLUS 环境再用CONNECT命令登录这样可以在登录前先做一些环境设置。# 启动 SQL*PLUS 但不登录任何数据库 sqlplus /nolog # 进入 SQL*PLUS 提示符后用 CONNECT 登录 SQL CONNECT scott/tigerorcl # 如果已经登录了一个数据库想切换到另一个同样用 CONN SQL CONN system/managerorcl2CONNECT命令后面跟的是「用户名/密码网络服务名」网络服务名对应 tnsnames.ora 里配置的条目。第 7 题问的就是这个场景已经登录到某一数据库想登录到另一数据库应该用CONN。DISC是断开当前连接GOTO和LOGON不是 SQL*PLUS 命令。这里有个细节CONN是CONNECT的缩写两者等价但在脚本里建议写全称避免可读性问题。2.2 显示表结构与当前用户DESC 和 SHOW USER第 3 题问显示 EMP 表结构的命令答案是DESC EMP。DESC是DESCRIBE的缩写它会列出表的列名、数据类型、是否为空。第 6 题问显示当前用户的命令答案是SHOW USER。这两个命令在日常排查里用得极多比如你连上数据库后不确定当前是哪个 schema先SHOW USER确认身份再DESC看表结构。-- 查看当前登录用户 SHOW USER; -- 查看 EMP 表结构 DESC EMP; -- 查看当前用户下所有表 SELECT table_name FROM user_tables;SHOW命令在 SQL*PLUS 里是一组环境查询命令的统称除了SHOW USER还有SHOW PARAMETER、SHOW SGA等。DESC只能用于表、视图、同义词等对象不能用于查询数据。如果你DESC一个不存在的表会报ORA-04043: object does not exist这时候先确认表名拼写和当前 schema 是否正确。2.3 执行上一条命令与服务器回显斜杠和 SET SERVEROUTPUT ON第 5 题问执行刚输入的一条命令用什么答案是正斜杠/。在 SQL*PLUS 里分号;是执行并提交当前缓冲区里的 SQL 语句而斜杠/是重新执行缓冲区里刚执行过的语句。这个区别在调试 PL/SQL 块时特别明显你写了一个匿名块用/执行后想再跑一遍直接再敲一个/就行不用重新输入整个块。第 4 题问 DBMS_OUTPUT.PUT_LINE 回显前要打开什么命令答案是SET SERVEROUTPUT ON。这个命令是 PL/SQL 调试的必备前置操作没有它DBMS_OUTPUT.PUT_LINE的输出不会显示在屏幕上。-- 打开服务器回显 SET SERVEROUTPUT ON; -- 测试回显 BEGIN DBMS_OUTPUT.PUT_LINE(Hello Oracle); END; /SET SERVEROUTPUT ON还有一个可选参数SIZE用来设置缓冲区大小默认是 2000 字节如果输出内容较长可以写成SET SERVEROUTPUT ON SIZE 1000000。常见翻车场景是在 PL/SQL Developer 或 SQL Developer 里执行匿名块输出窗口没内容八成是没开SERVEROUTPUT或者工具自己的输出开关没打开。3. 实例与数据库的启动关闭NOMOUNT、MOUNT、OPEN 三阶段与 SHUTDOWN 模式复习题里关于启动关闭的题目占了很大比重从第 13 题到第 19 题再到第 40 到 44 题几乎覆盖了 DBA 日常操作的核心。这一章把启动三阶段、关闭四种模式、以及 PMON 和 SMON 的分工讲清楚这些是面试里最容易被追问的点。3.1 启动三阶段参数文件、控制文件、数据文件的读取顺序数据库启动的三个阶段依次是 NOMOUNT、MOUNT、OPEN这是第 42 题的答案。第 44 题问启动过程中何时读参数文件答案是实例启动时也就是 NOMOUNT 阶段。这三个阶段各自读什么文件可以用一张表说清楚。阶段读取文件可执行操作NOMOUNT参数文件创建实例、查看 SGA 和后台进程MOUNT控制文件查看数据文件、日志文件信息做恢复OPEN数据文件、重做日志文件正常访问数据库STARTUP MOUNT方式是创建了数据库实例并且挂载了数据库但没有打开数据库这是第 13 题的答案。第 35 题问哪个说法不正确答案是 B因为数据库不能在 OPEN 状态下用ALTER DATABASE MOUNT降回 MOUNT 状态只能从 MOUNT 往 OPEN 走不能反向降级。这个点很多人记混以为可以随意切换实际上启动是单向递进的。-- 分阶段启动 STARTUP NOMOUNT; ALTER DATABASE MOUNT; ALTER DATABASE OPEN; -- 直接启动到 OPEN STARTUP; -- 启动到 MOUNT 状态 STARTUP MOUNT;第 41 题问如果数据文件或重做日志文件无法正常打开会怎样答案是 Oracle 返回错误信息不能打开数据库。因为 OPEN 阶段要读数据文件和重做日志文件任何一个有问题都会导致 OPEN 失败但实例和挂载状态还在可以进入恢复流程。3.2 关闭模式NORMAL、IMMEDIATE、TRANSACTIONAL、ABORT 的取舍第 43 题描述了一个场景Diane 执行 shutdown 后Oracle 在等待所有已连接用户断开连接问她用的是哪种方式。答案是 NORMAL因为SHUTDOWN NORMAL会等待所有用户断开后才关闭这是最温和的方式但也是最慢的。第 19 题问要求未完成事务回滚、立即停止处理应该用哪种方式。答案是SHUTDOWN IMMEDIATE它会回滚当前未提交的事务断开所有连接然后关闭数据库。SHUTDOWN TRANSACTIONAL是等待当前事务完成后才断开SHUTDOWN ABORT是直接中止不做检查点下次启动需要实例恢复。-- 正常关闭等待用户断开 SHUTDOWN NORMAL; -- 立即关闭回滚未提交事务 SHUTDOWN IMMEDIATE; -- 事务完成后再关闭 SHUTDOWN TRANSACTIONAL; -- 强制中止下次启动需实例恢复 SHUTDOWN ABORT;第 7 题填空题问用哪个命令关闭后重启需要实例恢复答案是SHUTDOWN ABORT。因为 ABORT 不做检查点脏数据还在内存里下次启动时 SMON 会利用重做日志做实例恢复。第 6 题填空题问哪个后台进程负责清理非正常中断留下的孤儿会话答案是 PMON。第 9 题选择题也是同一个考点进程意外终止由 PMON 释放资源。3.3 后台进程分工PMON、SMON、DBWn、LGWR、CKPT复习题第 33 题和第 34 题涉及 SGA 和后台进程。第 33 题问哪个说法不正确答案是 D因为 DBWR 负责将脏数据块写入数据文件而不是「将用户请求的数据放入缓存」放入缓存是服务器进程的事。第 34 题问哪个不属于 SGA答案是 D专用服务器模式下的会话信息属于 PGA不属于 SGA。进程职责常见考点PMON清理孤儿会话、释放资源进程意外终止时触发SMON实例恢复、清理临时段ABORT 关闭后启动时触发DBWn将脏数据块写入数据文件不是放数据入缓存LGWR将重做日志缓冲区写入日志文件提交时触发CKPT更新控制文件和数据文件头生成检查点第 36 题问执行 SELECT 时哪个进程从磁盘获取数据答案是服务器进程Server Process不是用户进程也不是 CKPT 或 LGWR。用户进程只负责发起请求服务器进程负责实际执行和读取数据。4. 逻辑存储结构与表空间块、区、段、表空间的层级关系复习题第 11、12、30、32 题都围绕逻辑存储结构。第 12 题问逻辑存储结构的组成关系答案是块-区-段-表空间-数据库。这个层级关系是 Oracle 存储管理的骨架理解它才能看懂表空间、数据文件、区的分配逻辑。4.1 块、区、段、表空间的层级与表空间类型Oracle 的逻辑单元从大到小是表空间、段对象、区、Oracle 块这是填空题第 5 题的答案。一个表空间可以容纳多张表但一张表只能归属于一个表空间这是第 11 题的答案。第 30 题问按照对区的管理方式表空间分为数据字典管理表空间和本地化管理表空间答案是区。-- 查看表空间 SELECT tablespace_name, status FROM dba_tablespaces; -- 查看数据文件 SELECT file_name, tablespace_name, bytes/1024/1024 AS size_mb FROM dba_data_files; -- 查看段的区分配 SELECT segment_name, segment_type, tablespace_name, extents FROM dba_segments WHERE owner SCOTT;常见做法是新建表空间时用本地化管理LOCAL因为数据字典管理DICTIONARY在 9i 之后已经不推荐使用本地化管理把区的分配信息放在数据文件头部的位图里减少数据字典争用。第 32 题问哪个不是本地 Net 服务名的内容答案是控制文件名因为本地 Net 服务名由通信协议、服务器主机、端口、服务名四部分构成控制文件是数据库服务器端的文件和客户端网络配置无关。4.2 数据文件扩展名与控制文件扩展名填空题第 11 题问数据文件扩展名答案是.dbf第 12 题问控制文件扩展名答案是.ctl。这两个扩展名是 Oracle 的默认约定不是强制的但生产环境基本都遵循。数据文件是物理存储表空间是逻辑容器一个表空间由一个或多个数据文件构成这是第 11 题选择题的考点。# 查看数据文件和控制文件的典型路径 ls -l $ORACLE_BASE/oradata/$ORACLE_SID/*.dbf ls -l $ORACLE_BASE/oradata/$ORACLE_SID/*.ctl第 31 题问哪个文件不属于数据库 Database 的一部分答案是参数文件。因为 Database 由控制文件、数据文件、重做日志文件三类组成参数文件属于实例的一部分实例由 SGA 和后台进程组成参数文件在 NOMOUNT 阶段被读取用来创建实例。5. PL/SQL 子程序与触发器过程、函数、包、游标和触发器的边界复习题第 16、17、22、23、24、27、29 题都涉及 PL/SQL。这部分是考试和面试的重灾区因为概念多、边界细容易记混。这一章把过程与函数的区别、包的创建顺序、游标操作、触发器的 :NEW 和 :OLD 讲清楚。5.1 过程与函数的区别、包的包头与包体第 16 题问过程和函数的叙述哪个正确答案是 B过程和函数都是命名的子程序每次执行前由数据库进行编译。A 说执行效率比普通 PL/SQL 块高这个说法不准确因为命名子程序编译一次后存储在数据库里后续调用不需要重新编译但普通 PL/SQL 块每次执行都要编译所以效率差异来自编译次数不是子程序本身。C 说过程没有返回参数函数有返回参数这个说法不严谨过程可以通过 OUT 参数返回值函数必须有 RETURN 返回值。D 说过程不带输入参数函数要带输入参数这也是错的两者都可以有输入参数。第 17 题问包的叙述哪个正确答案是 B包头和包体是可以分别创建的。第 39 题问包的使用说法哪个错误答案是 C因为包体中的过程和函数不一定必须在包头部分说明私有过程可以只在包体中定义不暴露给外部调用。-- 创建包头 CREATE OR REPLACE PACKAGE emp_pkg AS PROCEDURE raise_salary(p_empno NUMBER, p_amount NUMBER); FUNCTION get_salary(p_empno NUMBER) RETURN NUMBER; END emp_pkg; / -- 创建包体 CREATE OR REPLACE PACKAGE BODY emp_pkg AS PROCEDURE raise_salary(p_empno NUMBER, p_amount NUMBER) IS BEGIN UPDATE emp SET sal sal p_amount WHERE empno p_empno; END raise_salary; FUNCTION get_salary(p_empno NUMBER) RETURN NUMBER IS v_sal NUMBER; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno p_empno; RETURN v_sal; END get_salary; END emp_pkg; /包头和包体必须同名包头先创建包体后创建。如果只创建包头不创建包体调用包里的过程会报ORA-04068: existing state of packages has been discarded或ORA-04067: not executed, package body does not exist。常见做法是包头里只放公共接口私有过程和函数放在包体里不写在包头中。5.2 游标操作与触发器 :NEW 和 :OLD填空题第 14 题问 PL/SQL 中游标操作包括哪几步答案是定义游标、打开游标、读取游标、关闭游标。这是游标的四步操作缺一不可。第 29 题问一般在哪个里面有机会使用 :NEW 和 :OLD答案是触发器。第 27 题问关于触发器的说法哪个正确答案是 B语句级触发器不能使用 :OLD 和 :NEW因为语句级触发器不针对具体行只有行级触发器才有 :OLD 和 :NEW。-- 游标四步操作 DECLARE CURSOR c_emp IS SELECT empno, ename FROM emp WHERE deptno 10; v_empno emp.empno%TYPE; v_ename emp.ename%TYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_empno, v_ename; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_empno || || v_ename); END LOOP; CLOSE c_emp; END; / -- 行级触发器使用 :NEW 和 :OLD CREATE OR REPLACE TRIGGER trg_emp_audit AFTER UPDATE ON emp FOR EACH ROW BEGIN INSERT INTO emp_audit(empno, old_sal, new_sal, change_date) VALUES (:OLD.empno, :OLD.sal, :NEW.sal, SYSDATE); END; /第 23 题问哪个变量可以存放 sal 类型的值答案是 Bv_sal emp.sal%TYPE。A 是emp%ROWTYPE存放整行记录C 和 D 语法错误。%TYPE是锚定类型让变量的类型跟随列的类型变化这是 PL/SQL 里推荐的做法避免硬编码类型。6. 避坑与排查复习题里最容易记混的五个点这份复习题里有些题目看起来简单但实际考试和面试里错误率很高。我整理了五个最容易翻车的点每条按现象、原因、解决来说。6.1 TRUNCATE 和 DELETE 的效率差异现象题目问删除十万条记录但保留表结构哪个命令效率最高很多人选 DELETE。原因DELETE 是 DML 操作会写重做日志、触发触发器、可以回滚逐行删除效率低。TRUNCATE 是 DDL 操作直接释放区不写行级日志效率高得多。解决需要保留表结构且删除全部数据时用TRUNCATE TABLE a但注意 TRUNCATE 不能回滚也不能带 WHERE 条件。6.2 SHOW USER 和 SHOW ACCOUNT 的混淆现象第 6 题问显示当前用户的命令有人选SHOW ACCOUNT。原因SHOW命令后面跟的参数很多USER是显示当前用户名ACCOUNT不是 SQL*PLUS 的合法参数。解决记牢SHOW USER如果记不住可以用SELECT USER FROM DUAL替代效果一样。6.3 STARTUP MOUNT 和 STARTUP NOMOUNT 的适用场景现象第 13 题问 STARTUP MOUNT 方式启动时数据库处于什么状态有人选「创建了实例并打开了数据库」。原因MOUNT 阶段只读控制文件不读数据文件数据库没有 OPEN。解决记牢三阶段顺序NOMOUNT 只创建实例MOUNT 挂载数据库但不打开OPEN 才打开数据库。做恢复时通常先 STARTUP MOUNT恢复完再 ALTER DATABASE OPEN。6.4 位图索引的适用列现象第 46 题问位图索引最适用于哪种列有人选「重复值很低的列」。原因位图索引适合低基数列也就是重复值很高的列比如性别、状态标志。B 树索引适合高基数列比如主键。解决重复值高的列用位图索引重复值低的列用 B 树索引频繁插入更新的列不适合位图索引因为位图锁的粒度大。6.5 包体中的私有过程现象第 39 题问包的使用说法哪个错误有人选 B「包的私有过程不能被外部程序调用」。原因私有过程确实不能被外部调用这个说法是正确的所以不是答案。C 说「包体中的过程和函数必须在包头部分说明」才是错误的因为私有过程不需要在包头说明。解决包头只声明公共接口包体实现所有过程和函数私有过程只在包体中定义。7. 从复习题到实操用 SQL*PLUS 跑一遍启动关闭与 PL/SQL 调试复习题里的知识点最终要落到能动手操作上。这一章给出一套可复现的实操流程把启动关闭、表空间查看、PL/SQL 调试串起来。我一般会按这个顺序走一遍确认环境没问题。先确认当前数据库状态和实例信息。-- 查看数据库状态 SELECT status FROM v$instance; -- 查看数据库打开模式 SELECT open_mode FROM v$database; -- 查看当前用户 SHOW USER;v$instance的 status 通常是 OPEN如果是 MOUNTED 或 STARTED说明数据库没完全打开。v$database的 open_mode 是 READ WRITE 或 READ ONLY如果是 MOUNTED说明还在 MOUNT 阶段。然后查看表空间和数据文件确认存储结构。-- 查看表空间使用情况 SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024, 2) AS total_mb, ROUND(SUM(bytes - NVL(free_bytes, 0))/1024/1024, 2) AS used_mb FROM ( SELECT tablespace_name, bytes, NULL AS free_bytes FROM dba_data_files UNION ALL SELECT tablespace_name, NULL, bytes FROM dba_free_space ) GROUP BY tablespace_name;这个查询把数据文件大小和空闲空间合并算出每个表空间的总大小和已用大小。如果某个表空间已用接近 100%需要加数据文件或开自动扩展。接着测试 PL/SQL 调试链路。-- 打开服务器回显 SET SERVEROUTPUT ON SIZE 1000000; -- 创建测试过程 CREATE OR REPLACE PROCEDURE test_proc(p_id NUMBER) IS v_name VARCHAR2(50); BEGIN SELECT Student_ || p_id INTO v_name FROM DUAL; DBMS_OUTPUT.PUT_LINE(Generated: || v_name); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(Error: || SQLERRM); END test_proc; / -- 调用过程 BEGIN test_proc(1001); END; /如果DBMS_OUTPUT.PUT_LINE没有输出先检查SET SERVEROUTPUT ON是否执行再检查工具自己的输出开关。SQL*PLUS 里SET SERVEROUTPUT ON就够了但在 SQL Developer 里还要在「视图」菜单里打开「DBMS 输出」。最后验证启动关闭的恢复场景。先做一次 ABORT 关闭再启动观察 SMON 的实例恢复。-- 强制关闭 SHUTDOWN ABORT; -- 重新启动观察实例恢复 STARTUP; -- 查看告警日志确认恢复过程 SELECT value FROM v$diag_info WHERE name Default Trace File;SHUTDOWN ABORT后启动SMON 会自动做实例恢复告警日志里会看到「Instance recovery」相关的记录。这个操作在生产环境要谨慎但在测试环境里跑一遍能直观理解 SMON 的职责。从那以后我每次拿到一份复习题或题库都会先按技术模块拆开再挑几个关键点动手跑一遍确认自己真的理解了而不是只记住了选项。希望这份拆解能帮到你。本文还有配套的精品资源点击获取
