PL/SQL 变量范围和内部外部块:嵌套结构

什么是嵌套块 Oracle?

在 PL/SQL 中,每个块都可以嵌套在另一个块中。它们被称为嵌套块。当我们想要执行某个过程时,嵌套块非常常见,同时,这些过程的代码应该保存在单独的容器(块)中。

嵌套块概念将帮助程序员将复杂的事情分成每个块并处理主外部块内每个块的异常,从而提高可读性。

嵌套块结构

一个块可以嵌套在另一个块中。这可以嵌套在执行部分中,也可以嵌套在 异常处理 部分。这些块也可以被标记。一个外部块可以包含多个内部块。每个内部块又是一个 PL/SQL 块,因此内层块的所有属性和特征将与外层块相同。下图给出了嵌套块结构的图形表示。父块是主块,子块是嵌套块。

嵌套块结构

以下是嵌套块的语法。

嵌套块结构

嵌套块语法

<<outer_block>>
DECLARE
 <Declarative section> 
BEGIN
 <Execution part for outer block begins>

 <<inner block>>
 DECLARE
  <Declarative section>
 BEGIN
  <Execution part for inner block>.
 EXCEPTION 
  <Exception handling part>
 END;

 <Execution part for outer block begins> 
EXCEPTION 
<Exception handling part>
END;
  • 上述语法显示嵌套块总共包含两个块。
  • 这些块被标记为“outer_block”和“inner_block”

嵌套块中的作用域:变量作用域

在嵌套块中,使用之前需要清楚了解每个块的作用域和可见性。特别是在内部块中,外部块和内部块中的元素都是可见的,因此正确理解这一点是必要的。

以下几点将总结有关嵌套块中的范围的更多内容。

  • 外部块中声明的元素和在内部块定义之前定义的值在内部块内可见。
  • 内部块中声明的元素在外部块中不可见。它们仅在内部块内可见。
  • 外部块和内部块可以具有相同名称的变量。
  • 如果存在同名变量,则内部块默认仅引用内部块中声明的变量。
  • 如果内部块想要引用与其同名的外部块变量,则外部块应该被标记,并且外部块变量可以引用为' 。 ‘

下面的例子将有助于更多地理解这些范围。

例子1:在此示例中,我们将了解内部和外部块中变量的作用域。此外,我们还将了解如何使用块标签引用变量。

嵌套块中的作用域

<<OUTER_BLOC>>
DECLARE
varl VARCHAR2(30):='outer_block';
var2 VARCHAR2(30):='value before inner block’;
BEGIN
<<NNER_BLOCK>>
DECLARE
varl VARCHAR2(30):='inner_block';
BEGIN
dbms_output.put_line(varl), ‭	‬
dbms_output.put_line(OUTER_BLOCKvar1); 
dbms_output.put_line(var2);
END;
var2:='value after inner block';
END;
/

代码说明:

  • 代码行 1:将外部块标记为“OUTER_BLOCK”。
  • 代码行 3:将变量“var1”声明为VARCHAR2(30),其初始值为“外部块”。
  • 代码行 4:将变量“var2”声明为VARCHAR2(30),其初始值为“内部块之前的值”。
  • 代码第 6 行: 将内部块标记为“INNER_BLOCK”
  • 代码第 8 行: 在内部块中声明一个变量“var1”,为 VARCHAR2(30),初始值为“内部块”。
  • 代码第 10 行: 打印“var1”的值。由于默认情况下未提及标签,因此它将从内部块中获取值,因此打印“inner_block”消息。
  • 代码第 11 行: 打印外部块变量“var1”的值。由于内部块具有同名变量,因此我们需要引用外部块标签。因此打印消息“外部块”。
  • 代码第 12 行: 打印外部块变量“var2”的值。由于内部块中不存在同名变量,因此默认情况下它将从外部块中获取值,因此打印“内部块之前的值”消息。
  • 外部块中的变量“var2”已被赋值为“内部块后的值”。但此赋值发生在内部块定义之后。因此,该值不存在于内部块中。

例子2:在此示例中,我们将找出两个数字之间的差值,一个在外部块中声明,另一个在内部块中声明。两个数字将具有相同的名称。让我们看看块标签在引用这些变量时有何用处。

嵌套块中的作用域

<<OUTER_BLOC>>
DECLARE 
ln_val NUMBER :=5;
BEGIN
<<INNERBLOC>>
DECLARE 
ln_val NUMBER :=3;
BEGIN
dbms_output.put_line(The difference between outer block and inner block variable is:'||' outer_block. ln_val-inner_block.ln_val);
END;
END;
/

代码说明:

  • 代码行 1:将外部块标记为“OUTER_BLOCK”。
  • 代码行 3:将变量“ln_val”声明为NUMBER,初始值为“5”。
  • 代码第 5 行: 将内部块标记为“INNER_BLOCK”
  • 代码第 7 行: 在内部块中将变量“ln_val”声明为NUMBER,初始值为“3”。
  • 代码第 9 行: 打印外部块和内部块中“ln_val”值的差值。“ 。 ”格式来引用这些变量,以避免因变量名相同而产生冲突。

总结

在本教程中,我们学习了如何创建嵌套块以及如何处理内部块和外部块中的范围。我们还看到了一个示例,其中内部块和外部块中的变量在内部块中被引用。