2021年20个顶级PL/SQL面试问题和答案

211 阅读19分钟

今天的世界见证了每天都有铺天盖地的数据产生。每天大约有2.5万亿的数据产生,一项研究表明,世界上90%以上的数据是在过去两三年内产生的。

大量数据的产生导致了对一套合适的、结构良好的查询语言的需求。查询语言是一种计算机语言,它可以帮助我们处理大量的数据并检索特定的和有意义的数据。全球使用的查询语言之一是PL/SQL。

因此,让我们从PL/SQL到底是什么以及它的用途开始。我们还将强调你需要知道的PL/SQL的职业机会。最后,我们将通过经常被问到的PL/SQL面试问题,以及它们的详细答案。

什么是PL/SQL?

程序语言扩展到结构化查询语言是PL/SQL的完整形式。它是一种特殊的查询语言,因为它结合了SQL的数据操作功能和程序语言提供的处理能力。此外,PL/SQL的主要目的是通过加强数据库的安全性、坚固性和可移植性来顺利地处理所有的SQL语句。

在90年代初,Oracle开发了PL/SQL来改进结构化查询语言(SQL)的能力。PL/SQL集成了一系列与其他编程语言相似的功能,如集合、迭代和条件语句、程序、触发器、数组、函数等。

PL/SQL的职业机会

希望在PL/SQL中找到工作的人应该有很强的SQL、C编程语言、数据库和文本编辑器的背景。然而,要快速学习这些技能是很容易的。

PL/SQL开发人员负责开发高效的SQL查询,以提高数据库的性能,并分析可用的数据,为终端用户提供强大的解决方案。

以下是成为PL/SQL开发人员所需的技能清单。

  • 对Oracle数据库及其工具的深入了解。
  • 对程序、C编程语言、查询编写和执行以及触发器有透彻的了解。
  • 软件开发生命周期(SDLC)有深刻理解。
  • 有设计和实施ETL过程的经验。
  • 有能力调整SQL查询的性能。
  • 有创建、设计和实施数据模型的知识。

当你作为一个PL/SQL开发人员工作时,你将有机会与Oracle的各个领域合作。此外,在作为PL/SQL开发人员开发客户端查询时,你也将有机会管理基于SQL服务器的查询。

你甚至可以将你的PL/SQL职业转变为数据级或解决方案级的架构师,因为你拥有对PL/SQL代码的功能和特点的良好理解。此外,你可以转到分析员的角色,在那里你需要与分析工具一起工作,以产生有意义的业务洞察力。

因此,追求PL/SQL领域的职业提供了广泛的工作角色。虽然PL/SQL开发人员是主要角色,但还有许多其他角色,如数据分析师、SQL开发人员、ETL开发人员、PL/SQL管理员和PL/SQL性能优化开发人员等,你可以转换。

20个顶级PL/SQL面试问题和答案

以下是最重要的Pl/SQL面试问题以及它们的详细答案。

1.定义PL/SQL。

答案:PL/SQL。PL/SQL是结构化查询语言的程序性语言扩展的缩写。它是SQL的一个扩展版本,使我们能够使用函数、程序、控制结构等来设计和创建数据库应用程序。此外,PL/SQL是一种强大的查询语言,结合了SQL和程序语言的数据操作和处理功能。

另外,我们可以说,PL/SQL使用SQL来指示编译器 "做什么"。此外,它还使用过程性方法来指导编译器 "如何做"。PL/SQL还支持面向对象的概念、循环和与其他数据库语言类似的条件语句。

2.说明PL/SQL和SQL之间的一些区别。

答:PL/SQL与SQL的区别Oracle开发PL/SQL是为了克服SQL的一些重大缺点。下表显示了PL/SQL和SQL之间的不同之处。

SQLPL/SQL
它是一种用于与数据库交流的自然语言,代表结构化查询语言。它是SQL的扩展,是一种程序性语言/结构化查询语言。
SQL不支持程序性功能,如循环和条件测试。由于PL/SQL是一种程序性语言,它支持条件和循环语句。
数据库服务器每次只执行一个SQL查询,消耗大量的时间和精力。在PL/SQL中,数据库服务器接受一个完整的语句块并同时执行所有的语句。因此,它需要更少的时间,同时也消除了网络流量。
SQL不包含任何错误处理程序。你可以在PL/SQL中使用自定义的错误处理程序。
SQL没有变量。PL/SQL由变量和数据类型组成。
它是一种面向对象的语言。它是一种面向应用的语言。
使用SQL的主要目的是编写和执行查询、DDL和DML命令。PL/SQL支持函数、触发器、程序块和包。

3.请列举PL/SQL的重要特征。

答:PL/SQL的一些显著特点。PL/SQL的一些最显著的特点是。

  • 它支持通过一个PL/SQL命令一次性处理多个查询。
  • 由于PL/SQL是一种过程性语言,它支持循环、分支和决策。
  • 一旦用PL/SQL开发了代码,就可以作为不同的单元存储,如函数、触发器、程序和包。此外,我们还可以使用这些单元来开发其他应用程序。
  • PL/SQL包含了一个异常处理块,支持异常处理
  • 此外,在进行操作之前,我们可以在PL/SQL中验证和检查数据是否有错误和漏洞。
  • 最后,使用PL/SQL编写的代码是可移植的。我们可以在任何操作系统或具有Oracle引擎的计算机硬件上执行该代码。

4.解释一下PL/SQL中不同类型的数据类型。

解答:计算机编程中的数据类型告诉我们有关的信息。计算机编程中的数据类型告诉我们一个变量值的类型以及可以对其进行的操作。PL/SQL有四种不同的类型,如下所示。

  • 标量数据类型

这种数据类型包含了一个单一的或一个原子的值。因此,它没有内部组件。标量数据类型的例子是VARCHAR2, CHAR, DATE, LONG, NUMBER, 和BOOLEAN。

  • 复合数据类型

这种数据类型涉及内部组件。我们可以使用这些内部组件并轻松地对它们进行操作。这类数据类型的例子有RECORD, TABLE, 和VARRAY。

  • 参考数据类型

顾名思义,参考数据类型涉及一个指向其他数据项或程序项的指针。参考数据类型的一个例子是REF CURSOR。

  • 大对象数据类型

大对象(LOB)数据类型也涉及指向大对象的指针。这些对象是与其他程序项隔离的,如图像、文本、视频剪辑等。LOB数据类型的例子有二进制LOB、字符LOB、NCHAR LOB和二进制文件(BFILE)。

5.什么是%ROWTYPE和%TYPE数据类型?

答:%ROWTYPE和%TYPE。PL/SQL的%TYPE属性提供了一个表列或一个变量的数据类型。当我们想声明持有表列值的变量时,我们使用%TYPE。

PL/SQL的%ROWTYPE属性将一个变量声明为一个记录。然而,该变量的结构与表中的行相同。PL/SQL中的记录类似于表中的行。

6.描述一下PL/SQL包

答案:PL/SQL包。PL/SQL包是一种对象模式,它将逻辑上相连的子程序、项目和类型进行分类。它通常包含子程序、异常、变量、游标、常量、程序和函数。Oracle数据库将编译好的PL/SQL包存储在其中。

一个PL/SQL包有两个主要部分--包规范和包主体。包的规范部分定义了公共对象。由于这些对象是公共的,我们可以从包的外部访问或获取它们。此外,如果包的规格由游标和子程序组成,那么包主体应该包含查询和实现它们的代码。

PL/SQL包的下一个组成部分是包主体,包含子程序和游标的执行。它涉及到游标执行的查询和子程序的代码。此外,包主体允许我们声明私有变量。此外,它还包括一个专门的部分来处理异常。

7.解释一下PL/SQL的基本结构

答:PL/SQL的基本结构。由于PL/SQL是一种块状结构的语言,它的程序被写成并划分为逻辑代码块。PL/SQL块的结构是。

DECLARE
<declaration section>
BEGIN
<executable commands>
EXCEPTION
<exceptional handling>
END;

PL/SQL程序中的每个代码块由三部分组成。

  • 声明(Declarations)。

PL/SQL代码块的这一部分是可选的,用于定义所有的变量、子程序和其他在PL/SQL程序中要涉及的元素。在定义任何元素时,我们必须以 "DECLARE"关键字开始。

  • 可执行命令。

PL/SQL块的下一部分以关键字'BEGIN'开始。此外,PL/SQL块的这一部分以'END'关键词结束。PL/SQL块的这一部分是强制性的。所有可执行的PL/SQL语句或命令都存在于这两个关键词之间。

然而,至少应该有一个可执行的语句或命令。如果我们不想执行任何东西,它应该包含NULL命令。

  • 异常处理。

PL/SQL块的最后一部分是异常处理。和声明部分一样,这部分也是可以选择使用的。它涉及到一个或多个异常,管理PL/SQL程序中发生的错误。请确保在 "END "关键字之前添加这一部分。

8.定义一个PL/SQL游标并列出其类型。

答案是:一个指向内存区域或上下文区域的指针,由所有的SQL语句和处理这些语句的信息组成,被称为PL/SQL游标。PL/SQL游标可以帮助我们一次获取和处理多条记录。或者说,PL/SQL游标从数据库中选择多条记录,从这些记录中获取数据,并单独处理每条记录。

隐式游标和显式游标是PL/SQL中两种不同的游标。

  • 隐式游标。

如果我们执行任何SQL语句,比如INSERT、DELETE、UPDATE和SELECT,PL/SQL会创建一个游标,而不需要定义它。这样的游标类型被称为隐式游标。

  • 显式游标。

我们为从数据库中返回两条或多条记录的查询定义一个显式游标。然而,我们需要遵循四个步骤来声明一个显式游标。

  • 声明游标
  • 打开游标
  • 使用游标检索记录
  • 关闭游标

9.解释PL/SQL中的触发器。

解答:一般来说,我们知道触发器意味着激活。一般来说,我们知道,触发器意味着激活。PL/SQL中的触发器是以前开发或存储的程序。当任何数据库相关的事件发生时,Oracle引擎会自动激活或调用触发器。下面是Oracle引擎调用或启动触发器的某些事件。

  • 一个数据库操作,如SHUTDOWN, SERVERERROR, LOGOFF, STARTUP, 和LOGON。
  • 一个数据操作语言(DML)语句,如UPDATE、INSERT、SELECT和DELETE。
  • 数据定义语言(DDL)语句,如CREATE, ALTER, 和 DROP。

10.列出并解释PL/SQL块的类型。

答:有两种PL/SQL块。有两种PL/SQL块,如下表所示。

  • 匿名块

匿名块是那些没有分配给它们名字的块。我们不能将这些块作为数据库对象存储在服务器中。另外,我们需要在同一个会话中开发和使用匿名块。

  • 命名块

具有唯一名称的PL/SQL块被称为命名块。我们可以将命名块作为数据库对象存储在服务器中。此外,在命名块作为数据库对象出现在服务器中之前,我们可以使用它们。

11.解释一下SAVEPOINT、COMMIT和ROLLBACK这些术语。

答案:SAVEPOINT

COMMIT

当我们在PL/SQL程序中使用任何DML命令时,它会对存在于数据库缓冲区的数据进行修改。然而,实际的数据库并没有受到影响,保持不变。我们使用COMMIT语句来永久保存事务变化或使用任何DML命令后对行的变化。

语法。COMMIT。

回滚(ROLLBACK

如果我们希望撤销当前事务中的任何改变,我们可以使用ROLLBACK语句。这个语句可以停止当前事务的运行,并撤销在事务中所作的修改。

例如,考虑到我们从数据库中删除了一条错误的记录,我们需要恢复这条删除的记录。在这种情况下,我们必须使用ROLLBACK语句。

语法:ROLLBACK;

保存点(SAVEPOINT

SAVEPOINT语句是较长事务的理想选择。该语句将一个较长的事务划分为较小的部分,并在事务中标记出各点。与ROLLBACK语句不同,SAVEPOINT语句只允许回滚事务的一部分。

语法。Savepoint <savepoint_name>;

12.说明语法错误和运行时错误之间的区别。

答案:PL/SQL中的运行时错误。PL/SQL中的运行时错误是指PL/SQL块的异常处理部分所处理的错误。运行时错误的例子之一是SELECT语句没有从数据库中返回一条记录。在使用SAVEPOINT之前,所有的锁和对事务的修改都被保留下来。

PL/SQL中的语法错误可以是一个拼写错误或任何以错误格式书写的语法。PL/SQL编译器会从PL/SQL程序中识别出语法错误。

13.定义约束表和变异表。

回答:"约束表 "是指 "限制表"。mutating的一般含义是变化。因此,变异表是指当我们使用插入、更新或删除语句,即DML语句时被修改的表。

另一方面,我们要求访问和读取的参考完整性约束的表被称为约束表。

14.解释一下PL/SQL中写注释的方式。

解答:计算机编程中的注释有助于提高阅读效率。计算机编程中的注释有助于提高代码的可读性。此外,注释告诉人们代码的实际用途以及它的功能。在PL/SQL程序中添加注释并不影响其功能。在PL/SQL中,有不同的方法来编写单行和多行注释。

  • 单行注释

我们可以在实际注释前使用"-"符号来写单行注释。

  • 多行注释

要在PL/SQL中写多行注释,我们使用'/* */'符号。语法是。

/*注释行*/

下面是一个PL/SQL的单行和多行注释的实例。

DECLARE
num NUMBER(5); --it is a local variable
BEGIN
num := &p_num; /*it is a host variable
used only in the program body*/
END;

15.定义形式参数和实际参数。

答:正式参数形式参数是那些在过程头中声明的,并在过程主体中被调用的参数。为了理解形式参数,让我们看一个例子。

CREATE OR REPLACE FUNCTION square_area (side NUMBER)
RETURN NUMBER IS

在这里,边上的NUMBER是一个格式参数。

存在于过程调用或函数调用语句中的参数是实际参数。下面是一个实际参数的例子。

BEGIN
DBMS_OUTPUT.PUT_LINE(square_area (5));
END;
/

16.解释一下参数的三种不同模式。

答案:PL/SQL中的参数有三种不同的模式。PL/SQL中的参数有三种不同的模式,解释如下。

  • IN参数。

IN参数使我们能够向被调用程序传递数值。我们可以将IN参数初始化为默认值。此外,我们不能给IN参数分配任何其他的值,因为它们是常量。

  • OUT参数。

与IN参数不同,OUT参数不被初始化。我们不能在表达式中使用OUT参数。向调用者返回值的参数是OUT参数。指定这种类型的参数是不可缺少的。

  • IN OUT参数。

IN OUT参数是IN参数和OUT参数的组合。将值传递给过程,然后将值返回给调用者的参数是IN OUT参数。但是,我们需要给这些参数赋值,它们的功能就像初始化的变量。

17.说明并描述PL/SQL的异常情况。

答:在PL/SQL中发生的任何错误。在PL/SQL程序中发生的任何错误都会导致其意外终止。因此,PL/SQL程序涉及一个错误处理代码,用于处理PL/SQL块中发生的错误。这个错误处理代码存在于PL/SQL块的EXCEPTION部分。

以下是三种不同类型的PL/SQL异常。

  • 未定义的异常:非常罕见的错误,发生时没有定义名称。
  • 预先定义的异常:在PL/SQL块中发生的常见错误,具有预先定义的名称。
  • 用户定义的异常:违反业务规则的错误,但不会导致运行时错误。

18.解释一下PL/SQL中预定义的异常。

答:预定义异常。预定义异常涉及到发生的罕见错误,没有默认的名称。下面是PL/SQL中预定义的异常。

  • NO_DATA_FOUND:SELECT语句只涉及一条记录,并且没有返回数据。
  • INVALID_CURSOR: 当一个非法的操作发生时,会引发这个异常。
  • TOO_MANY_ROWS: SELECT语句使用了一条记录,并返回多条记录作为输出。
  • ZERO_DIVIDE:当PL/SQL代码试图除以一个零时,会抛出这个异常。

19.定义表达式。在PL/SQL中,有哪些不同种类的表达式?

答:PL/SQL中的表达式是指PL/SQL中的表达式是一系列的变量和字面符号。这些字面符号和变量是用操作符分开的。或者说,一个表达式是运算符和操作数的组合。此外,我们在PL/SQL中使用操作来比较、操作和计算数据。

PL/SQL表达式中的操作数可以是函数调用、常数或变量,而运算符是'+'和'*'。

在PL/SQL中使用的表达式有四种,分别是:

  • 布尔表达式:例如:'code'LIKE 'co%e'。
  • 日期表达式:例如:"SYSDATE>TO_DATE"。SYSDATE>TO_DATE('02-JUL-2021', "dd-mm-yy")。
  • 数值表达式:例如:10*20+5。
  • 字符串表达式:例如:10*20+5。length('code challenge' || 'ch')。

20.解释一下PL/SQL记录。

答:PL/SQL中的记录是一种用于保存数据项的数据结构。PL/SQL中的记录是一种用于保存数据项的数据结构。它是由几块数据或值组成的一组。此外,它还包括各种数据字段,类似于数据库表中的一行。一条记录中的所有数值或数据片断都具有相同的类型,并且相互之间有关联。

例如,考虑到我们需要保存一个图书馆中可用的书籍记录,其中每本书都有属性,如作者、ID和标题。在PL/SQL中,用来存储图书馆中所有这些书的字段的最佳数据结构被称为记录。

在PL/SQL块的声明部分,我们定义了记录。PL/SQL中的记录有三种类型。

  • 基于表的记录:我们使用带有%ROWTYPE属性的表名来定义基于表的记录。

语法。

DECLARE 
 record_name table_name%ROWTYPE;

例子。

DECLARE
 r_address address%ROWTYPE;

在上面的例子中,我们加热了一个名为r_address的记录,类似于地址表。

  • 基于游标的记录:我们使用带有%ROWTYPE属性的显式游标来定义一个基于游标的记录。

语法。

DECLARE
 Record_name cursor_name%ROWTYPE;

例子。

DECLARE
 CURSOR c_address IS
 SELECT house_no, street_name, city_name
 FROM address;
 r_address c_address%ROWTYPE;

在上面的例子中,首先,我们声明了一个显式游标c_address。这个游标从地址表的列house_no, street_name, city_name中获取数据。

在创建了一个显式游标之后,我们声明了一个名为r_address的记录,类似于c_address游标。

  • 程序员定义的记录:我们使用程序员定义的记录来创建一个结构不依赖于现有记录的记录。首先,我们将定义一个包含记录结构的记录类型。稍后,我们将使用其记录类型来声明该记录。

语法。

定义一个记录类型。

TYPE record_type IS RECORD(
 field_name1 data_type1 [[NOT NULL] := | DEFAULT default_value];
 field_name2 data_type2 [[NOT NULL] := | DEFAULT default_value];
 ...
);

根据上述记录类型来声明一条记录。

record_name record_type;

例子。

DECLARE
TYPE r_employee_contact_t
IS
RECORD
(
employee_name employees.name%TYPE,
first_name contacts.first_name%TYPE,
last_name contacts.last_name%TYPE
);
r_employee_contacts r_employee_contact_t;
BEGIN
NULL;
END;

结论

程序语言对结构化查询语言的扩展是全球范围内使用的最有力和最有活力的查询语言之一。它提供了各种好处,如高级别的安全性、面向对象的编程支持、对预定义SQL包的访问,以及对构建PL/SQL服务器页面和Web应用程序的支持。

此外,PL/SQL提供了广泛的职业机会。尽管PL/SQL不会发展或增强自己,而且已经过时,但对于Oracle来说,没有比这更好的选择了。它是与Oracle数据库一起使用的核心语言。因此,从事PL/SQL开发的职业是非常有益的。

这篇文章包含了面试中常用的PL/SQL面试问题和答案。如果你是一名应届生并参加了PL/SQL面试,熟悉这些问题和答案将有助于你在面试中获胜。