65 个 PL/SQL 面试问题及答案 (2025)
面向新手的 PL/SQL 面试问题和答案
1)什么是PL SQL?
Oracle PL/SQL 是 SQL 语言的扩展,它将 SQL 的数据操作能力与过程语言的处理能力相结合,以创建超强大的 SQL 查询。PL/SQL 通过增强数据库的安全性、可移植性和稳健性来确保 SQL 语句的无缝处理。
PL/SQL 代表“结构化查询语言的过程语言扩展”。
2)区分%ROWTYPE和TYPE RECORD。
% 行类型 当查询返回表或视图的整行时使用。
类型记录 另一方面,当查询返回不同表或视图的列时使用。
例如 TYPE r_emp 是 RECORD (sno smp.smpno%类型,sname smp sname%类型)
e_rec smp %行类型
游标c1是从smp中选择smpno,dept;
e_rec c1 %行类型
3)解释光标的用途。
游标是 SQL 中一个可访问信息的命名私有区域。对于返回多行的查询,它们需要单独处理每一行。
4)显示游标循环的代码。
Cursor 隐式地将 %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)显示一些预定义的异常。
索引上的重复值
零除法
没有找到数据
行数过多
光标已打开
无效号码
无效光标
程序错误
资源超时
存储错误
登录被拒绝
值错误
等等
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代码生成过程。
语法检查检查 PL SQL 代码是否存在编译错误。当所有错误都得到纠正后,将为保存数据的变量分配一个存储地址。这称为绑定。P 代码是 PL SQL 引擎的指令列表。P 代码存储在命名块的数据库中,并在下次执行时使用。
13)区分语法错误和运行时错误。
PL/SQL 编译器可以轻松检测到语法错误。例如,拼写错误。
运行时错误在 PL/SQL 块。例如,SELECT INTO 语句不返回任何行。
14)解释提交、回滚和保存点。
对于 COMMIT 语句,以下情况属实:
- 其他用户可以看到该事务所做的数据更改。
- 事务获取的锁被释放。
- 交易所完成的工作将成为永久性的。
当事务结束时,会发出 ROLLBACK 语句,并且以下内容是正确的。
- 过渡期间完成的工作将被撤消,就像从未发布过一样。
- 事务获取的所有锁均被释放。
它会撤消用户在事务中完成的所有工作。使用 SAVEPOINT,只能撤消部分事务。
15)定义隐式和显式游标。
游标默认是隐式的,用户无法控制或处理该游标中的信息。
如果查询返回多行数据,程序将定义一个显式游标。这允许应用程序在游标返回每一行时按顺序处理每一行。
16)解释变异表错误。
当触发器尝试更新当前正在使用的行时,会发生这种情况。它通过使用视图或临时表来修复,因此数据库会选择一个并更新另一个。
17)什么时候需要声明语句?
DECLARE 语句由 PL SQL 匿名块(例如独立的非存储过程)使用。如果使用该语句,则必须将其放在独立文件中的首位。
18)一个表可以应用多少个触发器?
一个表最多可以应用 12 个触发器。
19)SQLCODE 和 SQLERRM 的重要性是什么?
SQLCODE 返回最后遇到的错误的错误编号值,而 SQLERRM 返回最后错误的消息。
20) 如果游标已打开,我们如何在 PL SQL 块中找到?
可以使用%ISOPEN游标状态变量。
针对经验丰富的 PL/SQL 面试问题
21) 显示两个 PL/SQL 游标异常。
光标已打开
无效光标
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:
检查游标是否已获取任何行。如果已获取行,则为真
%NOT FOUND:
检查游标是否已获取任何行。如果未获取行,则为 True。
29)什么是相交?
Intersect 是两个表的乘积并且它只列出匹配的行。
30)什么是序列?
序列用于生成序列号,无需锁定开销。其缺点是如果事务回滚,序列号将丢失。
31) 插入和删除触发器之前和之后如何引用列值?
使用关键字“new.列名”,触发器可以通过新集合引用列值。使用关键字“old.列名”,触发器可以通过旧集合引用列值。
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 不允许在其位置上制定决策语句。
从 smp 中选择解码(totalsal=12000,'high',10000,'medium')作为解码_tesr,其中 smpno 在(10,12,14,16)中;
该语句返回错误。
CASE在PL SQL中直接使用,但DECODE在PL SQL中只能通过SQL使用。
41)解释自主交易。
自治事务是主事务或父事务的独立事务。如果它由另一个事务启动,则不会嵌套。
有几种情况可以使用自主事务,例如事件日志和审计。
42)区分SGA和PGA。
SGA 代表系统全局区域,而 PGA 代表程序或进程全局区域。PGA 仅分配 10% 的 RAM 大小,而 SGA 分配 40% 的 RAM 大小。
43)Pre_defined_functions 的位置是什么。
它们存储在名为“函数、过程和包”的标准包中
44)解释 PL SQL 中的多态性。
多态性是 OOP 的一个特性。它能够创建具有多种形式的变量、对象或函数。PL/SQL 支持以成员函数或包内的程序单元重载形式实现的多态性。在进行重载时,必须避免使用明确的逻辑。
45)MERGE 有什么用途?
MERGE 用于将多个 DML 语句合并为一个。
语法:merge into 表名
使用(查询)
on(连接条件)
当不匹配时
[插入/更新/删除] 命令
当匹配时
[插入/更新/删除] 命令
针对 5 年以上经验人员的 PL/SQL 面试问题
46)分布式数据库系统中可以同时执行 2 个查询吗?
是的,它们可以同时执行。在基于两阶段提交的分布式数据库系统中,一个查询始终独立于第二个查询。
47)解释Raise_application_error。
它是 DBMS_STANDARD 包的一个过程,允许从数据库触发器或存储子程序发出用户定义的错误消息。
48) 尽管 return 语句也可以在 pl/sql 中使用,但是 out 参数有什么用途?
Out 参数允许在调用程序中使用多个值。不建议在函数中使用 Out 参数。如果需要多个值,可以使用过程代替函数。因此,这些过程用于执行 Out 参数。
49)如何将日期转换为儒略日期格式?
我们可以使用 J 格式字符串:
SQL > 从 Dual 中选择 to_char(to_date('29-Mar-2013′,'dd-mon-yyyy'),'J') 作为朱利安;
JULIAN
50)解释 SPOOL
Spool命令可以将sql语句的输出打印到文件中。
假脱机/tmp/sql_outtxt
从 smp 中选择 smp_name、smp_id,其中 dept='accounts';
轴关闭;
51)说出 PL/SQL 包由什么组成?
PL/SQL 包由以下部分组成
- PL/SQL 表和记录类型语句
- 程序和功能
- 游标
- 变量(表、标量、记录等)和常量
- 用于将错误号与异常关联的异常名称和指令
- 游标
52)说出 PL/SQL 包有什么好处?
它提供了多种好处,例如
- 强制信息隐藏: 它提供了选择将数据保密还是公开的自由
- 自上而下的设计: 你可以在实际实现模块本身之前设计隐藏在包中的代码的接口
- 对象持久性: 包规范中声明的对象的行为类似于应用程序中所有 PL/SQL 对象的全局数据。您可以在一个模块中修改包,然后将这些更改引用到另一个模块
- 面向对象设计: 该软件包让开发人员能够很好地控制软件包内的模块和数据结构的使用方式
- 保证交易的完整性: 它提供了一定程度的交易完整性
- 性能改进: - RDBMS 自动跟踪数据库中存储的所有程序对象的有效性并提高包的性能。
53)请提及跟踪 PL/SQL 代码有哪些不同的方法?
跟踪代码是衡量运行时代码性能的关键技术。跟踪的不同方法包括
- DBMS_应用程序信息
- DBMS_跟踪
- DBMS_SESSION 和 DBMS_MONITOR
- trcsess 和 tkproof 实用程序
54)请说明分层分析器的作用是什么?
分层分析器除了可以填补漏洞和性能跟踪期望之间的差距外,还可以分析 PL/SQL 中的调用。分层分析器的效率包括
- 独特的报告 SQL 和 PL/SQL 时间消耗
- 报告 PL/SQL 中不同子程序调用的计数,以及每个子程序调用所花费的时间
- 使用命令行实用程序以 HTML 格式提供多个交互式分析报告
- 比传统分析器和其他跟踪实用程序更有效
55)请提及 PLV 消息允许您做什么?
PLV 消息可让您
- 将单个文本消息分配给 PL/SQL 表中的指定行
- 它通过号码检索消息文本
- 它会自动用标准信息代替你自己的信息 Oracle 限制切换的错误消息
- 直接从数据库表批量加载消息编号和文本 PLV msg PL/SQL 表
56)请提及 PLV(PL/Vision)套餐提供什么?
- 空替代值
- 断言例程集
- 杂项工具
- PL 视觉中使用的常量集
- 预定义数据类型
57)请提及 PLVprs 和 PLVprsps 有什么用途?
- PLVprs: 它是 PL/SQL 字符串解析的扩展,是字符串解析功能的最低级别
- PLVprsps: 它是将 PL/SQL 源代码解析为单独原子的最高级别包。它依赖于其他解析包来完成工作。
58) 解释如何提前将文件复制到文件内容并将文件复制到 PL/SQL 表 PL/SQL?
只需一个程序调用 – “fcopy 过程”, 您可以将一个文件的完整内容复制到另一个文件中。而要将文件的内容直接复制到 PL/SQL 表中,您可以使用程序“file2pstab”.
59)解释 PL/SQL 中如何提前进行异常处理?
对于 异常处理 PL/SQL 提供了一个有效的插件PLVexc。PLVexc支持四种不同的异常处理动作。
- 继续处理
- 记录然后继续
- 停止处理
- 记录然后停止处理
对于那些再次发生的异常,您可以使用 RAISE 语句。
60) 请提及在 PL/SQL 中将日志信息写入数据库表时可能遇到什么问题?
在将日志信息写入数据库表时,您面临的问题是,只有在将新行提交到数据库后,这些信息才可用。这可能是一个问题,因为 PLVlog 通常用于跟踪错误,在许多此类情况下,当前事务将失败或需要回滚。
61) 请提及用于将 PL/SQL 表日志传输到数据库表的函数是什么?
将 PL/SQL 表日志传输到数据库日志表函数 “程序 ps2db” 用来。
62) 什么时候必须使用 PLVlog 的默认“回滚到”保存点?
当用户打开回滚活动且未在 put_line 调用中提供替代保存点时,将使用 PLVlog 的默认“回滚到”保存点。默认保存点初始化为 c none 常量。
63) 为什么 PLVtab 被认为是访问 PL/SQL 表最简单的方法?
PL/SQL 表是 PL/SQL 中最接近数组的,为了访问此表,您必须先声明表类型,然后必须声明 PL/SQL 表本身。但通过使用 PLVtab,您可以避免定义自己的 PL/SQL 表类型,并使 PL/SQL 数据表访问变得简单。
64) 请说明当显示 PL/SQL 表的内容时 PLVtab 可以做什么?
PLVtab 可让您在显示 PL/SQL 表的内容时执行以下操作
- 显示或隐藏表格标题
- 显示或隐藏表值的行号
- 在表格的每一行前显示前缀
65)解释如何将消息保存或放置在表中?
要将消息保存在表中,您可以通过两种方式进行
- 通过调用以下函数加载单个消息
add_text
程序 - 使用以下方法从数据库表中加载消息集:
load_from_dbms
程序
66)请提及 PL/SQL 中函数“module procedure”的用途是什么?
“模块过程”允许通过一次过程调用转换特定程序单元中的所有代码行。模块有三个参数
- 模块输入
- 科尔因
- 最后一个模块
67)说出 PLVcmt 和 PLVrb 在 PL/SQL 中的作用?
PL/Vision 提供了两个包来帮助您管理 PL/SQL 应用程序中的事务处理。它们是 PLVcmt 和 PLVrb。
- 血小板减少率: PLVcmt 包包含处理提交处理的逻辑和复杂性
- 局部低压: 它提供了一个编程接口来回滚 PL/SQL 中的活动
这些面试问题也会对你的口试有帮助