你是否正在准备 PL/SQL 面试,如果是,那么我们将在此处列出 PL/SQL 面试问题列表?
PL(过程语言)是 SQL(结构化查询语言)的扩展,其中开发人员可以使用过程、分支和迭代等控制结构、模块和函数编写复杂的数据库交互。它与 SQL 紧密集成并支持动态和静态 SQL。
除了面试中的其他问题,了解 SQL 和 PL/SQL 的不同之处也很重要。PL/SQL 相对于 SQL 的一些优点是:
- 支持过程处理、条件语句、循环等类似于高级语言的特性。
- 可以将多个语句以过程的形式一次发送到数据库服务器,从而节省时间和网络流量。
- 自定义错误处理是可能的。
- 完全便携。
介绍PL/SQL 1.0 于 1992 年发布,Oracle 6 作为可选扩展。正是在 PL/SQL 2.0中引入了存储过程、函数、用户定义的记录类型、表、包和扩展(如 DBMS_*)。最新的 PL/SQL 版本是 11.0,它是随 Oracle 11g 一起发布的,具有原生编译、PL/SQL 函数结果缓存和分钟依赖跟踪等高级特性。
最佳PL-SQL常见面试题和答案合集PL-SQL常见的面试题有哪些?下面是面试官在面试中会问到的一些常见的基础和高级pl/sql面试题和答案:
问题:什么是 PL/SQL?答:一种程序语言,其中代码可以在块中执行。它是 SQL 的扩展。
问题:PL/SQL 和 SQL 有什么区别?PL-SQL面试题解析:
SQL | PL/SQL |
SQL 是一种与数据库交互的查询语言。 | 它是 SQL 的扩展,支持过程、函数和更多特性。 |
仅支持可以对表执行插入、更新、删除的简单查询。 | 可以执行像高级编程语言这样的复杂任务,例如,while 循环、if-else 语句等…… |
SQL 语句一次只能执行一个,从而使其成为一个耗时的过程。 | 整个语句块一次性发送到数据库服务器执行,节省时间,提高效率。 |
没有错误处理的规定。 | 自定义错误处理是可能的。 |
[
DECLARE]
--declaration statements (optional)
BEGIN
--execution statements
[
EXCEPTION]
--exception handling statements
END;
问题:定义游标及其用途。答:游标是指向Oracle 分配的用于处理SQL 语句的内存区域的指针。游标用于保存 SQL 查询返回的记录。有两种类型的游标——隐式和显式。
问题:我们为什么要使用数据库触发器?给出触发器的语法。答:触发器是一个在事件发生时自动调用的存储过程。事件可能是:插入、更新、删除等…… 语法 –
create trigger [
trigger_name]
[
before | after]on [
table_name]
[
for each row]
[
trigger_body]
问题:如何编译 PL/SQL 代码?答:首先进行语法检查。当开发人员纠正任何语法错误时,Oracle 将所有保存数据的变量与存储地址绑定。最后,进行 p 代码生成过程。
问题:解释 PL/SQL 中的异常处理。答: PL/SQL 提供定制的异常处理。发生错误时,程序本身会包含错误处理代码。有3种类型的例外——
- 预定义异常 - 已定义的常见错误。示例 – NO_DATA_FOUND
- 未定义异常 – 没有预定义名称的错误。
- 用户定义的异常——由用户编写的代码处理。
- 标量类型——原始数据类型,如 CHAR、DATE、LONG、VARCHAR2 等……
- 复合 - 这些由其他数据类型组成,可以轻松更新。例如,记录、表格等...
- 引用数据类型,如 CURSOR
- 大对象类型——BLOB、CLOB 等……
%TYPE | %ROWTYPE |
声明与表列的数据类型相同的变量的属性。 | 声明与表行具有相同结构的 RECORD 类型变量的属性。该行是包含与表或视图的列具有相同数据类型和名称的字段的记录。 |
例子 -DECLARE | 例子 -DECLARE stud_rec students.%ROWTYPE;
|
- 包装规格
- 包体
在此处查看: 基本 SQL 命令清单
问题:各种预定义的异常是什么?答:PL-SQL常见面试题和答案合集:预定义异常是在程序执行过程中发生的内部定义异常。例如,PL/SQL 在选择操作时没有返回行时引发 NO_DATA_FOUND,如果使用选择语句返回多于一行,则会生成 TOO_MANY_ROWS 错误。还有一些例子:
- COLLECTION_IS_NULL:当集合为空时
- CURSOR_ALREADY_OPEN:当游标已经打开时
- LOGIN_DENIED:登录不正确或权限不存在时
问题:语法错误和运行时错误有什么区别?PL-SQL面试题解析:
语法错误 | 运行时错误 |
这些是编译器发现的编译时错误。 | 这些不会被编译器检测到并导致程序给出不正确的结果。 |
在这些问题得到解决之前,代码不会构建和运行。 | 代码编译运行,如果出现错误,程序中途停止。 |
一些示例缺少分号或方括号 (; , {})、类拼写错误、关键字等。 | 例如空指针异常、数字除以零、数组索引越界等。 |
int x = 9 字符串名称 = null;在第一行中,缺少一个分号,编译器将捕获该分号 | 字符串名称 = null; if(name.equals(“lsbin.com”)){....} 由于name为null,运行时会在执行代码时捕获异常 |
DBMS_ALERT | 当特定数据库值发生变化时,使用触发器提醒应用程序。警报是基于事务的和异步的。 |
DBMS_OUTPUT | 显示来自 PL/SQL 块、包、子程序和触发器的输出。主要用于显示 PL/SQL 调试信息。 |
DBMS_PIPE | 不同的会话使用这个包通过命名管道进行通信。过程 PACK_MESSAGE 和 SEND_MESSAGE 将消息打包到管道中,然后将其发送到另一个会话。 |
HTF 和 HTP | 允许 PL/SQL 程序生成 HTML 标签。 |
UTL_FILE | 让 PL/SQL 程序读取和写入 OS 文本文件。 |
UTL_HTTP | 允许你的 PL/SQL 程序进行超文本传输??协议 (HTTP) 标注。该包有两个入口点,每个入口点都接受一个 URL(统一资源定位符)字符串,联系指定的站点,并返回请求的数据,通常是 HTML 格式。 |
UTL_SMTP | 允许 PL/SQL 程序通过 SMTP 发送电子邮件。 |
问题:解释字符函数?答:字符函数是操作字符数据的函数。这些更普遍地称为字符串函数。例子:
LEFT | 从字符串的左侧返回提到的字符数。LEFT(value, NoOfChars) | LEFT('Lsbin', 3) 将给出 Lsb。 |
RIGHT | 从右边返回指定数量的字符。RIGHT(value, NoOfChars) | RIGHT ('banker', 2) 将返回 er。 |
SUBSTRING | 从字符串的任何部分选择数据。SUBSTRING(value, StartPosition, NoOfChars) | SUBSTRING('lsbin.com',0,5) 将返回 lsbin。 |
LTRIM | 从左侧修剪空白。 | LTRIM(' lsbin.com') 将返回 lsbin.com。 |
RTRIM | 从右侧修剪空白。 | RTRIM('lsbin.com ') 将返回 lsbin.com。 |
UPPER | 将所有字符转换为大写。 | UPPER('lsbin.com') 返回 LSBIN.COM。 |
LOWER | 将所有字符转换为小写。 | LOWER('LSBIN.COM') 返回 lsbin.com。 |
SELECT SYSDATE FROM dual;
select customer_id, TO_CHAR(SYSDATE, 'yyyy/mm/dd') from customer where customer_id <
200;
USER: USER 返回当前会话的 user_id。
例子:
select USER from dual;
问:SGA 和 PGA 有什么区别?回答:
SGA | PGA |
系统全局区 | 程序全球区 |
包含一个 Oracle 数据库实例的数据和控制信息 | 包含专用于单个 Oracle 进程的数据和控制信息 |
组件的共享内存区域 | 非共享内存区域 |
示例:缓存数据块和 SQL 区域 | 示例:会话内存、SQL 工作区 |
MERGE INTO orders o
USING customer c
ON (o.cust_id = c.cust_id)
WHEN MATCHED THEN
UPDATE SET o.del_address = c.address
WHEN NOT MATCHED THEN
INSERT (cust_id, address)
VALUES (c.emp_id, c.address);
在此示例中,如果找到具有匹配条件的记录,则更新同一记录的地址,否则插入新行。
问题:解释 PL-SQL 包的好处。答:使用 PL/SQL 包有很多好处:
- 更好的代码管理,因为包为子程序提供了一个容器
- 自顶向下的应用程序设计方法,实现和规范分离(接口)
- 如果子程序有任何变化,则无需更改依赖对象或重新编译整个包
- 可以指定可访问性(私有/公共),从而维护代码的安全性
- 数据可以跨事务维护整个会话,而无需存储在数据库中
- 在子程序的第一次调用时,整个包被加载,因此后续调用不需要磁盘 I/O,从而提供更好的性能。
问题:解释过程和函数之间的区别。PL-SQL面试题解析:
功能 | 程序 |
函数每次编译它被要求执行。 | 程序已预先编译并保存。无论何时调用,它们都会执行预编译的代码。 |
可以从 SQL 语句中调用。 | 不能从 SQL 语句中调用。 |
该函数必须返回一个值。 | 不需要返回任何值。 |
一般用于计算目的。 | 用于执行复杂的业务逻辑。 |
可以使用其他方法返回多个值,否则只返回一个值。 | 可以返回多个值 |
返回标量数据类型。 | 默认返回一个 int。 |
不能从函数调用存储过程 | 该过程可以调用任何函数 |
函数可以嵌入在 select 语句中 | 在 select 语句中,不能调用过程。 |
异常处理是不可能的 | 可以在过程中定义 Try/catch 块 |
程序 | TRIGGER |
由用户、触发器或应用程序显式调用 | 每当数据库中发生事件时由 DBMS 执行。 |
可以有参数 | 没有参数 |
不能处于非活动状态 | 可以根据需要启用或禁用 |
创建 - 创建过程 | 创建 - 创建触发器 |
- 隐式游标——PL/SQL 对返回单行的 INSERT、UPDATE、DELETE 和 SELECT 语句应用隐式游标。
- 显式游标——由程序员为返回多行的查询创建。句法-
CURSOR is
SELECT statement;
OPEN ;
FETCH INTO ;
CLOSE ;
问题:有哪些不同类型的约束?回答:
- 不为空
- 独特的
- 首要的关键
- 外键
- 查看
触发器 | 约束 |
存储为单独的对象 | 表上的约束与表定义一起存储 |
触发器在事件发生时触发;因此它们在约束后被解雇 | 约束被触发使用该表。 |
执行表到表比较,因此更快 | 执行内存位置以表比较缓慢导致性能低下。 |
触发器是针对整个表的 | 约束是针对表的一列 |
它们只是自动执行的存储过程,因此不检查数据完整性。 | 防止重复和无效的数据条目 |
命名块是存储在数据库服务器中并可重复使用的函数和过程。匿名块是一次性使用的,不存储在服务器中。例子:
DECLARE message VARCHAR2(255):= 'Welcome to PL/SQL';
byzero NUMBER;
BEGINDBMS_OUTPUT.put_line (message);
byzero := 1/0;
EXCEPTIONWHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
问题:解释 PL/SQL 记录。答:记录包含一组各种数据类型的数据,这些数据可以作为字段相互关联。PL/SQL 支持的三种记录类型是基于表的记录、基于程序员的记录和基于游标的记录。
问题:解释提交和保存点之间的区别。回答:
COMMIT - 用于使数据库更改永久化。所有保存点都被擦除,交易结束。一旦提交,事务就不能回滚。
SAVEPOINT – 用于在事务期间设置点,程序员可以稍后回滚到该点。当有一系列事务可以分为具有保存点的组时,它会很有帮助。
问题:实参和形参有什么区别?答:用于调用过程的参数称为实参。例子 -
get_student_details(stud_name, dob);
-- here stud_name and dob are actual parameters.
在主体中使用的过程头中声明的变量称为形式参数。例子 -
PROCEDURE get_student_details (dob DATE) IS – here stud_name is a formal parameter.
问题:如何使用 DECLARE 语句?答: DECLARE 用作独立文件的第一条语句,这些文件由匿名代码块组成,这些代码块不是存储过程、函数或触发器。例子 -
DECLARE
num1 NUMBER(2);
num2 NUMBER(3);
BEGIN
-- logic goes here
END;
问题:请介绍一下 SQLCODE 和 SQLERRM。答: SQLCODE 和 SQLERRM 用于跟踪程序中未显式处理的异常。这些是全局定义的变量。SQLCODE 返回错误代码,而 SQLERRM 返回相应的错误消息。
问题:什么是回滚?它与回滚到语句有何不同?答:回滚会清除所有数据库更改,包括所有保存点。它结束一个事务。
“回滚到”将更改回滚到代码中提到的保存点。交易仍将处于活动状态。
问题:什么是IN OUT参数?答案: IN OUT 参数模式将一个值传递给子程序并返回一个更新的值。
问题:是否可以在运行时接受用户输入?如何?回答:是的,这是可能的。使用 ACCEPT 关键字从用户那里获取输入。例子 -
接受年龄号码提示“输入你的年龄:”
问题:给出一个简单的方法来更快地运行查询。答:通过使用 ROWID。它不是物理列,而是行的逻辑地址。它包含块号、文件号和行号,从而减少 I/O 时间,从而使查询执行更快。
问题:PL/SQL 中有哪些预定义的异常?答案: ZERO_DIVIDE、NO_DATA_FOUND、TOO_MANY_ROWS、INVALID_CURSOR、DUP_VAL_ON_INDEX 等等……
问题:如何跟踪 PL/SQL 代码?答:你可以通过 DBMS_* 方法进行跟踪,例如
- DBMS_APPLICATION_INFO
- 数据库管理系统_跟踪
- DBMS_SESSION 和 DBMS_MONITOR
问题:PL/SQL 中 UTL_FILE 包的用途是什么?答:通过使用这个包,开发者可以得到代码在电脑上读写文件。为此,开发人员需要 DBA 用户授予访问权限。
问题:什么是 DBMS_OUTPUT 和 DBMS_DEBUG?答:两者都可以用于调试代码。DBMS_OUTPUT 将输出打印到控制台,而 DBMS_DEBUG 将其打印到日志文件。
问题:列出 PL/SQL 中的一些游标属性。回答:
- %ISOPEN:检查游标是否打开
- %ROWCOUNT:获取更新、删除或获取的行数。
- %FOUND:检查游标是否已获取任何行,返回布尔值。
- %NOT FOUND:检查游标是否已获取任何行。返回布尔值。
NVL (occupation, ‘default’)
问题:在一张表上,可以应用多少个触发器?答: 12 是最大数目。
问题:我们如何使用 PL/SQL 实现一致性?PL-SQL面试题解析:我们可以通过设置合适的隔离级别来实现一致性。例如,为了提供读取一致性,可以将隔离级别设置为 READ COMMITTED。
问题:编写一个简单的过程,使用一些参数从数据库中选择一些记录。答案:示例代码 –
CREATE PROCEDURE get_customer_details @age nvarchar(30), @city nvarchar(10)
ASBEGIN
SELECT * FROM customers WHERE age = @age AND city = @city;
END;
PL-SQL常见的面试题有哪些 - 问题:解释错误 ORA-03113。答案:通信通道 ORA-03113 上的文件结束错误意味着客户端和服务器通道之间的连接已断开。可能是超时,因此连接丢失。你可以通过 ping 服务器并检查连接来进行故障排除。
问题:你可以在 SELECT 语句中使用 IF 语句吗?如何?答:是的,我们可以在版本 9 及更高版本中使用 DECODE 关键字来实现。例子 -
SELECT day_of_week,
DECODE (number, 0, 'Sunday',
1, 'Monday',
2, 'Tuesday',
3, 'Wednesday',
4, 'Thursday',
5, 'Friday',
6, 'Saturday',
'No match') result FROM weekdays;
问题:SYS.ALL_DEPENDENCIES 是什么?答: SYS.ALL_DEPENDENCIES 描述了当前用户可访问的包、过程、函数、触发器之间的所有依赖关系。它显示名称、类型、dependency_type、referenced_owner 等列……
PL-SQL常见面试题和答案合集结论【PL-SQL常见的面试题有哪些(答案和解析介绍)】在本文中,我们介绍了一些最重要的 pl/sql 面试问题,这些问题肯定会让你通过最艰难的面试。如果你想深入学习这些概念并获得一些实践经验,请查看我们的 PL/SQL 教程。
推荐阅读
- Python与JavaScript差异对比(有哪些区别())
- 最佳的机器学习常见面试题和答案合集解析
- MongoDB常见面试题有哪些(答案和解析指南)
- Jenkins常见面试题有哪些(答案和解析指南)
- 10大常用Python通用库(哪个比较好())
- 2022年最佳C++ IDE和编辑器合集(哪个最好())
- JSON与XML有什么区别(比较、特性和示例)
- 最佳数据结构常见面试题和答案合集
- 详解Windows系统下SSD 4K对齐最正确的办法