PL/SQL 代码块:结构、语法和匿名示例

⚡ 智能摘要

PL/SQL 代码块是基本的执行单元,它将 PL/SQL 和 SQL 指令组合在一起,使它们能够一起执行,而不是逐行执行。每个代码块都包含声明部分、执行部分和异常处理部分,代码块可以是匿名的,也可以是命名的。

  • 🧱 核心理念: Code 被分组到一个整体运行的模块中,将过程逻辑与 SQL 混合在一起。
  • 📝 声明部分: 可选;声明代码块中使用的变量、游标、异常和子程序。
  • ▶️ 执行部门: 必填项;以 BEGIN 开头,并且至少包含一条可执行语句。
  • 🛡️ 例外情况部分: 可选;以 EXCEPTION 开头,处理运行时错误。
  • 🏷️ 两种类型: 匿名块没有名称,只运行一次;命名块存储为数据库对象。
  • 🔁 命名块: 过程和函数是可重复调用的命名代码块。
  • ⛔ 终结者: END 表示代码块结束,而正斜杠则表示代码块发送给编译器。

PL/SQL 块结构和语法

什么是PL/SQL块?

在 PL/SQL 中,代码不是以单行格式执行的;它总是按组执行。ping 将代码封装成一个名为“代码块”的单个元素。在本教程中,您将学习有关这些代码块的知识。

代码块包含PL/SQL和SQL指令。所有这些指令会作为一个整体执行,而不是逐条执行。

块结构

PL/SQL 代码块具有预定义的结构,代码按结构分组。以下是 PL/SQL 代码块的不同组成部分:

  1. 声明部分
  2. 执行部分
  3. 异常处理部分

下图展示了不同的 PL/SQL 代码块及其顺序。

PL/SQL 代码块部分和顺序

声明部分

这是 PL/SQL 代码块的第一部分,它是可选的。在这一部分中,需要声明代码块中的变量、游标、异常、子程序、编译指示指令和集合。该部分还有一些其他特性:

  • 本部分为可选部分,如果不需要任何声明,则可以跳过。
  • 如果存在,它应该是 PL/SQL 代码块中的第一部分。
  • 触发器和匿名代码块以关键字“DECLARE”开头。对于其他子程序,则没有此关键字;子程序名称后面的部分用于标记声明部分。
  • 它后面必须始终跟执行部分。

执行部分

执行部分是主要且必不可少的部分,它实际执行其中编写的代码。因为 PL / SQL 预期包含可执行语句,此代码块不能为空,且必须至少包含一行有效的可执行语句。此部分还有一些其他特性:

  • 它可以包含 PL/SQL 代码和 SQL 代码。
  • 它可以包含一个或多个嵌套的块。
  • 它以关键词“BEGIN”开头。
  • 后面应该跟“END”或者异常处理部分(如果有的话)。

异常处理部分

异常是运行时不可避免的错误,需要进行处理。 Oracle 提供以代码块形式呈现的异常处理部分。该部分还可以包含 PL/SQL 语句,并且是可选的。

  • 这是处理执行块中引发的异常的部分。
  • 这是 PL/SQL 代码块的最后一部分。
  • 来自此部分的控制永远不能返回到执行块。
  • 它以关键词“异常”开头。
  • 它后面应该始终跟关键字“END”。

关键字“END”表示PL/SQL代码块的结束。

PL/SQL 块语法

以下是 PL/SQL 块结构的语法。

PL/SQL 块语法

DECLARE --optional
<declarations>

BEGIN --mandatory
<executable statements. At least one executable statement is mandatory>

EXCEPTION --optional
<exception handles>

END; --mandatory
/

注意: 代码块后面应该始终跟一个“/”,这会向编译器发送有关代码块结束的信息。

PL/SQL 块的类型

PL/SQL 代码块主要分为两种类型:

  1. 匿名区块
  2. 命名块

下面先对两者进行简要比较,然后再分别进行描述。

方面 匿名区块 命名块
有名字 没有 是
存储在数据库中 没有 是的,作为一个对象
以。。开始 声明或开始 CREATE
可重复使用 仅限同一会话 随时可调用

匿名块

匿名块是指没有被分配任何名称的 PL/SQL 块。它们必须在同一会话中创建和使用,因为它们不会作为数据库对象存储在服务器上。

由于它们不存储在数据库中,因此无需单独的编译步骤。它们直接编写并执行,编译和执行在同一个进程中完成。其他一些特点:

  • 这些代码块没有引用名称。
  • 它们以关键字“DECLARE”或“BEGIN”开头。
  • 由于它们没有引用名称,因此无法存储以供以后使用,必须在同一会话中创建和执行。
  • 它们可以调用其他已命名的块,但不能调用匿名块,因为它没有引用。
  • 它们可以包含命名或匿名的嵌套块,也可以嵌套在任何块中。
  • 它们可以包含所有三个部分,其中执行部分是必需的,其他两部分是可选的。

命名块

命名块具有特定且唯一的名称。它们作为数据库对象存储在服务器上,因此只要存在即可引用或使用。命名块的编译过程是在它们作为数据库对象创建时单独进行的。其他一些特性:

  • 这些块可以被其他块调用。
  • 该代码块的结构与匿名代码块相同,只是它永远不会以“DECLARE”开头。相反,它以“CREATE”开头,这指示编译器将其创建为数据库对象。
  • 这些模块可以嵌套在其他模块中,也可以包含嵌套的模块。
  • 命名块基本上有两种类型:
  1. 程序
  2. 功能

您可以在指南中了解更多关于这些命名模块的信息。 程序和功能.

常见问题

只有执行部分,即以 BEGIN 开头、以 END 结尾的部分。声明部分和异常处理部分是可选的,如果不需要可以省略。

匿名代码块没有名称,不会被存储,并且在同一会话中运行。命名代码块(例如过程或函数)会作为数据库对象存储,并且可以重复调用。

在 SQL*Plus 等工具中,单独一行的斜杠会告诉编译器代码块已完成,应该执行。如果没有斜杠,工具会一直等待更多输入。

是的。AI 可以将逻辑封装在 CREATE PROCEDURE 头部,添加参数,并将声明移动到合适的位置。测试结果,因为存储过程可能需要显式的参数模式和错误处理。

是的。声明部分和异常处理部分是独立的选项。一个代码块可以从 BEGIN 开始,跳过声明部分,然后在 END 之前仍然包含一个 EXCEPTION 部分来捕获运行时错误。

总结一下这篇文章: