65 个 PL/SQL 面试问题及答案 (2025)
初学者 PL/SQL 面试问题
1)什么是 PL/SQL?
Oracle PL/SQL 是 SQL 语言的扩展,它将 SQL 的数据操作能力与过程语言的处理能力相结合,从而创建功能强大的 SQL 查询。PL/SQL 通过增强数据库的安全性、可移植性和健壮性,确保 SQL 语句的无缝处理。
PL/SQL 代表“过程语言扩展到结构化查询语言”。
2)区分 %ROWTYPE 和 TYPE RECORD。
%ROWTYPE 用于查询返回表或视图的整个行时。
另一方面,TYPE RECORD 用于查询返回不同表或视图的列时。
例如:TYPE r_emp is RECORD (sno smp.smpno%type,sname smp sname %type)
e_rec smp %ROWTYPE
Cursor c1 is select smpno,dept from smp;
e_rec c1 %ROWTYPE
3)解释游标的用途。
游标是 SQL 中一个命名的私有区域,可以从中访问信息。对于返回多行的查询,需要使用游标来单独处理每一行。
4)展示游标 for 循环的代码。
游标隐式地将 %ROWTYPE 声明为循环索引。然后它打开一个游标,从活动集中获取行的值到记录字段中,并在所有记录处理完毕后关闭。
例如:
FOR smp_rec IN C1 LOOP totalsal=totalsal+smp_recsal; ENDLOOP;
5)解释数据库触发器的用途。
与特定数据库表关联的 PL/SQL 程序单元称为数据库触发器。它用于
1)审计数据修改。
2)透明地记录事件。
3)强制执行复杂的业务规则。
4)维护副本表
5)派生列值
6)实现复杂的安全授权
6)有两种类型的异常。
PL/SQL 块的错误处理部分称为异常。它们有两种类型:用户定义和预定义。
7)展示一些预定义异常。
DUP_VAL_ON_INDEX
ZERO_DIVIDE
NO_DATA_FOUND
TOO_MANY_ROWS
CURSOR_ALREADY_OPEN
INVALID_NUMBER
INVALID_CURSOR
PROGRAM_ERROR
TIMEOUT _ON_RESOURCE
STORAGE_ERROR
LOGON_DENIED
VALUE_ERROR
等等。
8)解释 Raise_application_error。
它是 DBMS_STANDARD 包的一个过程,允许从数据库触发器或存储子程序发出用户定义的错误消息。
9)展示如何在 PL/SQL 块中调用函数和过程。
函数作为表达式的一部分被调用。
total:=calculate_sal('b644')
过程作为语句在PL/SQL中调用。
calculate_bonus('b644');
10)解释数据库触发器执行期间可用的两个虚拟表。
表列被引用为 OLD.column_name 和 NEW.column_name。
对于 INSERT 相关的触发器,只有 NEW.column_name 值可用。
对于 DELETE 相关的触发器,只有 OLD.column_name 值可用。
对于 UPDATE 相关的触发器,两个表列都可用。
11)进行比较时要遵循哪些关于 NULL 的规则?
1)NULL 永远不会是 TRUE 或 FALSE
2)NULL 不能等于或不等于其他值
3)如果表达式中的某个值是 NULL,则该表达式本身将计算为 NULL,但连接运算符(||)除外
12)PL/SQL 过程是如何编译的?
编译过程包括语法检查、绑定和 p-code 生成过程。
语法检查会检查 PL/SQL 代码的编译错误。纠正所有错误后,将为存储数据的变量分配一个存储地址。这称为绑定。P-code 是 PL/SQL 引擎的指令列表。P-code 存储在数据库中供命名块使用,并在下次执行时使用。
13)区分语法错误和运行时错误。
PL/SQL 编译器可以轻松检测到语法错误。例如,拼写错误。
运行时错误可以通过 PL/SQL 块中的异常处理部分来处理。例如,SELECT INTO 语句,该语句不返回任何行。
14)解释 Commit、Rollback 和 Savepoint。
对于 COMMIT 语句,以下内容成立:
- 其他用户可以看到事务所做的数据更改。
- 事务获得的锁被释放。
- 事务的工作被永久保存。
当事务结束时,会发出 ROLLBACK 语句,并且以下内容成立:
- 事务中所做的工作将被撤销,就像从未发出过一样。
- 事务获得的所有锁都被释放。
它撤销用户在事务中所做的所有工作。使用 SAVEPOINT,只能撤销部分事务。
15)定义隐式和显式游标。
游标默认是隐式的。用户无法控制或处理此游标中的信息。
如果查询返回多行数据,则程序定义一个显式游标。这允许应用程序在游标返回每一行时按顺序处理它。
16)解释 mutating table 错误。
当触发器尝试更新其当前正在使用的行时,会发生此错误。通过使用视图或临时表可以解决此问题,因此数据库选择一个并更新另一个。
17)何时需要 declare 语句?
DECLARE 语句由 PL/SQL 匿名块使用,例如独立的、非存储的过程。如果使用,它必须出现在独立文件的开头。
18)一个表可以应用多少个触发器?
最多可以对一个表应用 12 个触发器。
19)SQLCODE 和 SQLERRM 的重要性是什么?
SQLCODE 返回最后遇到的错误的错误号值,而 SQLERRM 返回最后一个错误的错误消息。
20)如果在 PL/SQL 块中,游标是打开的,如何找到?
可以使用 %ISOPEN 游标状态变量。
有经验者 PL/SQL 面试问题
21)展示两个 PL/SQL 游标异常。
Cursor_Already_Open
Invaid_cursor
22)哪些运算符处理 NULL?
NVL 将 NULL 转换为另一个指定的值。
var:=NVL(var2,'Hi');
IS NULL 和 IS NOT NULL 可用于专门检查变量的值是否为 NULL。
23)SQL*Plus 是否也包含 PL/SQL 引擎?
不,SQL*Plus 中没有嵌入 PL/SQL 引擎。因此,所有 PL/SQL 代码都直接发送到数据库引擎。这更有效率,因为每个语句都不会被单独剥离。
24)PL/SQL 开发人员可以使用哪些包?
DBMS_ 系列包,例如 DBMS_PIPE、DBMS_DDL、DBMS_LOCK、DBMS_ALERT、DBMS_OUTPUT、DBMS_JOB、DBMS_UTILITY、DBMS_SQL、DBMS_TRANSACTION、UTL_FILE。
25)解释触发器的 3 个基本部分。
- 触发语句或事件。
- 限制
- 操作
26)什么是字符函数?
INITCAP、UPPER、SUBSTR、LOWER 和 LENGTH 都是字符函数。组函数根据行组返回结果,而不是单个行。它们是 MAX、MIN、AVG、COUNT 和 SUM。
27)解释 TTITLE 和 BTITLE。
TTITLE 和 BTITLE 命令控制报表标题和页脚。
28)展示 PL/SQL 的游标属性。
%ISOPEN:
检查游标是否已打开
%ROWCOUNT:
更新、删除或提取的行数。
%FOUND:
检查游标是否已提取任何行。如果提取了行,则为 True
%NOT FOUND:
检查游标是否已提取任何行。如果未提取行,则为 True。
29)什么是 Intersect?
Intersect 是两个表的乘积,它只列出匹配的行。
30)什么是序列?
序列用于生成序列号,而无需锁定开销。其缺点是如果事务被回滚,序列号将丢失。
31)如何在插入和删除触发器之后引用列值?
使用关键字“new.column name”,触发器可以通过 new collection 引用列值。使用关键字“old.column name”,它们可以通过 old collection 引用列值。
32)SYSDATE 和 USER 关键字的用途是什么?
SYSDATE 指的是当前服务器系统日期。它是一个伪列。USER 也是一个伪列,但指的是当前登录到会话的用户。它们用于监控表中发生的变化。
33)ROWID 如何帮助更快地运行查询?
ROWID 是行的逻辑地址,它不是物理列。它由数据块号、文件号和数据块中的行号组成。因此,检索行的 I/O 时间得以最小化,从而提高了查询速度。
34)数据库链接用于什么?
创建数据库链接是为了在各种数据库或测试、开发和生产等不同环境之间建立通信。数据库链接是只读的,也可以用来访问其他信息。
35)提取游标做什么?
提取游标逐行读取结果集。
36)关闭游标做什么?
关闭游标会清除私有 SQL 区域并释放内存。
37)解释控制文件的用途。
它是一个二进制文件。它记录数据库的结构。它包括多个日志文件的位置、名称和时间戳。它们可以存储在不同的位置,以帮助在某个文件损坏时检索信息。
38)解释一致性
一致性表明数据在提交之前不会反映给其他用户,从而维护了一致性。
39)区分匿名块和子程序。
匿名块是未命名的块,不存储在任何地方,而子程序是编译并存储在数据库中的。它们在运行时编译。
40)区分 DECODE 和 CASE。
DECODE 和 CASE 语句非常相似,但 CASE 是 DECODE 的扩展版本。DECODE 不允许在其位置使用决策语句。
select decode(totalsal=12000,’high’,10000,’medium’) as decode_tesr from smp where smpno in (10,12,14,16);
此语句会返回错误。
CASE 直接用于 PL SQL,而 DECODE 仅通过 SQL 用于 PL SQL。
41)解释自治事务。
自治事务是主事务或父事务的独立事务。如果它是由另一个事务启动的,则它不是嵌套的。
有几种情况可以使用自治事务,例如事件日志记录和审计。
42)区分 SGA 和 PGA。
SGA 代表 System Global Area,而 PGA 代表 Program or Process Global Area。PGA 只分配 10% 的 RAM 容量,而 SGA 分配 40% 的 RAM 容量。
43)预定义函数的存放位置是什么?
它们存储在名为“Functions, Procedures and Packages”的标准包中。
44)解释 PL/SQL 中的多态性。
多态性是 OOP 的一个特性。它是创建具有多种形式的变量、对象或函数的能力。PL/SQL 以成员函数或包内的程序单元重载的形式支持多态性。重载时必须避免歧义逻辑。
45)MERGE 的用途是什么?
MERGE 用于将多个 DML 语句合并为一个。
语法:merge into tablename
using(query)
on(join condition)
when not matched then
[insert/update/delete] command
when matched then
[insert/update/delete] command
5年以上有经验者 PL/SQL 面试问题
46)分布式数据库系统中可以同时执行 2 个查询吗?
是的,它们可以同时执行。在分布式数据库系统中,根据两阶段提交,一个查询始终独立于第二个查询。
47)解释 Raise_application_error。
它是 DBMS_STANDARD 包的一个过程,允许从数据库触发器或存储子程序发出用户定义的错误消息。
48)即使 return 语句也可以在 PL/SQL 中使用,为什么还要使用 out 参数?
Out 参数允许在调用程序中传递多个值。不建议在函数中使用 Out 参数。如果需要多个值,可以使用过程而不是函数。因此,这些过程用于执行 Out 参数。
49)如何将日期转换为儒略日期格式?
我们可以使用 J 格式字符串。
SQL > select to_char(to_date(’29-Mar-2013′,’dd-mon-yyyy’),’J’) as julian from dual;
JULIAN
50)解释 SPOOL
Spool 命令可以将 SQL 语句的输出打印到一个文件中。
spool/tmp/sql_outtxt
select smp_name, smp_id from smp where dept=’accounts’;
spool off;
51)提及 PL/SQL 包包含什么?
PL/SQL 包包含
- PL/SQL 表和记录 TYPE 语句
- 过程和函数
- 游标
- 变量(表、标量、记录等)和常量
- 异常名称和 pragmas,用于将错误号与异常关联
- 游标
52)提及 PL/SQL 包有什么好处?
它提供了许多好处,例如:
- 强制信息隐藏: 它允许选择将数据设为私有还是公开。
- 自顶向下设计: 您可以在实际实现模块之前设计包中隐藏代码的接口。
- 对象持久性: 在包规范中声明的对象在应用程序的所有 PL/SQL 对象中表现得像全局数据。您可以在一个模块中修改包,然后在另一个模块中引用这些更改。
- 面向对象设计: 包为开发人员提供了对其内部模块和数据结构使用方式的强大控制。
- 保证事务完整性: 它提供了事务完整性级别。
- 性能改进:RDBMS 会自动跟踪数据库中存储的所有程序对象的有效性,并提高包的性能。
53)提及追踪 PL/SQL 代码的不同方法是什么?
代码追踪是衡量运行时代码性能的关键技术。追踪的不同方法包括:
- DBMS_APPLICATION_INFO
- DBMS_TRACE
- DBMS_SESSION 和 DBMS_MONITOR
- trcsess 和 tkproof 实用程序
54)提及分层分析器做什么?
除了弥补性能追踪中的漏洞和预期之间的差距之外,分层分析器还可以分析 PL/SQL 中进行的调用。分层分析器的优点包括:
- 区分SQL 和 PL/SQL 时间消耗的报告。
- 报告 PL/SQL 中调用的不同子程序次数以及每次子程序调用花费的时间。
- 使用命令行实用程序生成多种交互式 HTML 格式的分析报告。
- 比传统分析器和其他追踪实用程序更有效。
55)提及 PLV msg 允许您做什么?
PLV msg 使您能够:
- 为 PL/SQL 表中的指定行分配单独的文本消息。
- 它通过编号检索消息文本。
- 它可以使用 restrict 切换自动替换您自己的消息以代替标准的 Oracle 错误消息。
- 将消息编号和文本从数据库表批量加载到 PLV msg PL/SQL 表中。
56)提及 PLV (PL/Vision) 包提供什么?
- Null 替换值
- 断言例程集
- 杂项实用程序
- PL Vision 中使用的常量集
- 预定义数据类型
57)提及 PLVprs 和 PLVprsps 的用途是什么?
- PLVprs:它是 PL/SQL 的字符串解析扩展,也是最低级别的字符串解析功能。
- PLVprsps:它是将 PL/SQL 源代码解析为独立原子的最高级别包。它依赖于其他解析包来完成工作。
58)解释如何在高级 PL/SQL 中将文件复制到文件内容以及将文件复制到 PL/SQL 表?
使用单个程序调用 - “fcopy procedure”,您可以将一个文件的全部内容复制到另一个文件中。要将文件的内容直接复制到 PL/SQL 表中,您可以使用程序“file2pstab”。
59)解释高级 PL/SQL 中的异常处理是如何进行的?
对于异常处理 PL/SQL,提供了有效的插件 PLVexc。PLVexc 支持四种不同的异常处理操作。
- 继续处理
- 记录并继续
- 停止处理
- 记录并停止处理
对于会再次发生的异常,您可以使用 RAISE 语句。
60)提及在 PL/SQL 中将日志信息写入数据库表时可能遇到什么问题?
在将日志信息写入数据库表时,您遇到的问题是,只有在提交新行到数据库后才能获得这些信息。这可能是一个问题,因为 PLVlog 通常用于跟踪错误,在许多情况下,当前事务会失败或需要回滚。
61)提及用于将 PL/SQL 表日志传输到数据库表的函数是什么?
要将 PL/SQL 表日志传输到数据库日志表,可以使用函数“PROCEDURE ps2db”。
62)何时应该使用 PLVlog 的默认“rollback to”savepoint?
当用户开启了回滚活动并且在 put_line 调用中未提供备用 savepoint 时,将使用 PLVlog 的默认“rollback to”savepoint。默认 savepoint 初始化为 c none 常量。
63)为什么 PLVtab 被认为是访问 PL/SQL 表最简单的方式?
PL/SQL 表最接近 PL/SQL 中的数组,要访问这些表,您必须首先声明一个表类型,然后您必须声明 PL/SQL 表本身。但是,通过使用 PLVtab,您可以避免定义自己的 PL/SQL 表类型,并使 PL/SQL 数据表访问变得容易。
64)提及当您显示 PL/SQL 表的内容时,PLVtab 使您能够做什么?
当您显示 PL/SQL 表的内容时,PLVtab 使您能够执行以下操作:
- 显示或隐藏表的标题。
- 显示或隐藏表值的行号。
- 在表的每一行之前显示一个前缀。
65)解释如何保存或将您的消息放入表中?
要将消息保存在表中,您可以通过两种方式执行此操作:
- 通过调用
add_text
过程加载单个消息。 - 通过
load_from_dbms
过程从数据库表加载消息集。
66)提及 PL/SQL 中的“module procedure”函数有什么用?
“module procedure”能够通过一个过程调用将一个特定程序单元中的所有代码行进行转换。模块有三个参数:
- module_in
- cor_in
- Last_module_in
67)提及 PLVcmt 和 PLVrb 在 PL/SQL 中做什么?
PL/Vision 提供了两个包来帮助您管理 PL/SQL 应用程序中的事务处理。它们是 PLVcmt 和 PLVrb。
- PLVcmt:PLVcmt 包封装了处理提交逻辑和复杂性。
- PLVrb:它提供了对 PL/SQL 中回滚活动的编程接口。
这些面试问题也将有助于您的口试