PL/SQL 变量

2024 年 8 月 29 日 | 阅读 6 分钟

变量是一个有意义的名称,方便程序员在代码执行期间临时存储数据。它可以帮助您在 PL/SQL 程序中操作数据。它只不过是分配给存储区域的名称。PL/SQL 中的每个变量都有一个特定的数据类型,该数据类型定义了变量内存的大小和布局。

变量长度不应超过 30 个字符。它的字母可以选择后跟更多字母、美元符号、数字、下划线等。

1. 在使用变量之前,需要在 PL/SQL 块的声明部分首先声明该变量。

2. 默认情况下,变量名不区分大小写。保留的 PL/SQL 关键字不能用作变量名。

如何在 PL/SQL 中声明变量

您必须在声明部分或在包中声明 PL/SQL 变量作为全局变量。声明后,PL/SQL 会为变量的值分配内存,并且存储位置由变量名标识。

声明变量的语法

以下是声明变量的语法

此处,variable_name 是 PL/SQL 中的有效标识符,datatype 必须是有效的 PL/SQL 数据类型。具有大小、比例或精度限制的数据类型称为约束声明。约束声明比非约束声明需要的内存更少。

示例

Radius Number := 5;

Date_of_birth date;

声明限制

在 PL/SQL 中声明变量时,有一些限制。

  • 不允许前向引用,即您必须在另一个语句中引用常量或变量之前声明它,即使它是声明性语句。
    val number := Total - 200;
    Total number := 1000;
    第一个声明是非法的,因为必须先声明 TOTAL 变量才能在赋值表达式中使用它。
  • 属于同一数据类型的变量不能在同一语句中声明。
    N1, N2, N3 Number;
    这是一个非法声明。

PL/SQL 变量的命名规则

PL/SQL 中的变量必须遵循一些命名规则,就像其他编程语言一样。

  • variable_name 不应超过 30 个字符。
  • 变量名不应与该块的表列相同。
  • 变量名必须以 ASCII 字母开头。PL/SQL 不区分大小写,因此可以是小写或大写。例如:v_data 和 V_DATA 指的是相同的变量。
  • 您应该使您的变量易于阅读和理解,在第一个字符之后,它可以是任何数字、下划线 (_) 或美元符号 ($)。
  • NOT NULL 是变量上的可选规范。

在 PL/SQL 中初始化变量

每次声明变量时,PL/SQL 都会为其定义一个默认值 NULL。 如果您想使用 NULL 值以外的其他值初始化变量,您可以在声明期间通过使用以下方法之一来完成。

  • DEFAULT 关键字
  • 赋值运算符

您还可以指定 NOT NULL 约束以避免 NULL 值。 如果您指定了 NOT NULL 约束,则必须为该变量分配初始值。

您必须具备良好的编程技巧才能正确初始化变量,否则,有时程序会产生意外结果。

初始化变量的示例

让我们举一个简单的例子来更好地解释它

执行后,这将产生以下结果

Value of c: 70
Value of f: 33.333333333333333333

PL/SQL procedure successfully completed.

PL/SQL 中的变量作用域

PL/SQL 允许嵌套块。 一个程序块可以包含另一个内部块。 如果您在内部块中声明一个变量,则外部块无法访问它。 有两种类型的变量作用域

  • 局部变量:局部变量是内部块变量,外部块无法访问。
  • 全局变量:全局变量在最外层块中声明。

局部变量和全局变量的示例

让我们举一个例子来展示局部变量和全局变量的简单用法

执行后,这将产生以下结果

Outer Variable num1: 95
Outer Variable num2: 85
Inner Variable num1: 195
Inner Variable num2: 185

PL/SQL procedure successfully completed.

变量属性

当您声明一个 PL/SQL 变量来保存列值时,它必须具有正确的数据类型和精度,否则执行时会发生错误。 PL/SQL 提供了一种无需使用 %TYPE 和 %ROWTYPE 属性指定特定数据类型即可声明变量的功能,而不是硬编码变量的数据类型和精度。 这两个属性允许我们指定一个变量,并让该变量的数据类型由表/视图列或 PL/SQL 包变量定义。

% 符号用作属性指示符。 这种声明变量的方法具有一个优势,因为用户不必担心编写和维护代码。

以下是 PL/SQL 中变量属性的类型。

  • %TYPE

%TYPE 属性用于根据已声明的变量或数据库列声明变量。 它用于声明单个变量,而不是记录。 使用 %TYPE 属性声明的变量的数据类型和精度与从给定表中引用的列的数据类型和精度相同。 当声明将保存数据库值的变量时,这特别有用。 使用 %TYPE 关键字时,用户必须知道列的名称和变量将对应的表。 然后,这些将以变量名称为前缀。 如果引用了先前声明的变量,则将该变量名称作为 %TYPE 属性的前缀。

使用 %TYPE 声明变量的语法是

其中 <column_name> 是在 <tab_name> 中定义的列。

考虑一个声明。

SALARY EMP.SAL % TYPE;

此声明将声明一个变量 SALARY,该变量具有与 EMP 表的 SAL 列相同的数据类型。

示例

执行后,这将产生以下结果

Enter value for ecode: 7499
Salary of 7499 is = 1600
PL/SQL procedure successfully completed.  
  • %ROWTYPE

%ROWTYPE 属性用于声明表示表中一行的记录类型。 该记录可以存储整行或从表中选择的某些特定数据。 行中的列和记录中的相应字段具有相同的名称和数据类型。

使用 %ROWTYPE 声明变量的语法是

其中 <variable_name> 是在 <tab_name> 中定义的变量。

考虑一个声明。

EMPLOYEE EMP. % ROW TYPE;

此声明将声明一个名为 EMPLOYEE 的记录,该记录具有与 EMP 表中的列具有相同名称和数据类型的字段。 您可以按如下方式访问 EMPLOYEE 记录的元素

EMPLOYEE.SAL := 10000;

EMPLOYEE.ENAME := ‘KIRAN’;

示例

执行后,这将产生以下结果

Row Inserted
PL/SQL procedure successfully completed.  

优点

  • 如果您在声明时不知道数据类型。 分配给关联变量的数据类型将在运行时动态确定。
  • 如果您引用的变量的数据类型发生变化,则 %TYPE 或 %ROWTYPE 变量会在运行时更改,而无需重写变量声明。 例如:如果 EMP 表的 ENAME 列从 VARCHAR2(10) 更改为 VRACHAR2(15),则您无需修改 PL/SQL 代码。

下一个主题PL/SQL 常量