PL/SQL 变量

2024年11月20日 PL/SQL 变量 极客笔记

PL/SQL 变量

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

变量的长度不能超过30个字符。可以使用字母(后跟更多字母)、美元符号、数字、下划线等。

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

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

如何在PL/SQL中声明变量

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

声明变量的语法:

声明变量的语法如下:

variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]

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

示例:

半径数值:= 5;

出生日期日期;

声明限制:

在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关键字
  • 赋值运算符
counter binary_integer := 0;
greetings varchar2(20) DEFAULT 'Hello JavaTpoint';  

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

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

初始化变量的示例

让我们举一个简单的例子来解释得更清楚:

DECLARE
   a integer := 30;
   b integer := 40;
   c integer;
   f real;
BEGIN
   c := a + b;
   dbms_output.put_line('Value of c: ' || c);
   f := 100.0/3.0;
   dbms_output.put_line('Value of f: ' || f);
END;

执行后,将会产生以下结果:

Value of c: 70
Value of f: 33.333333333333333333

PL/SQL procedure successfully completed.

PL/SQL的变量作用域:

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

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

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

让我们通过一个简单的示例来展示局部变量和全局变量的使用:

DECLARE
 -- Global variables 
   num1 number := 95; 
   num2 number := 85; 
BEGIN 
   dbms_output.put_line('Outer Variable num1: ' || num1);
   dbms_output.put_line('Outer Variable num2: ' || num2);
   DECLARE 
      -- Local variables
      num1 number := 195; 
      num2 number := 185; 
   BEGIN 
      dbms_output.put_line('Inner Variable num1: ' || num1);
      dbms_output.put_line('Inner Variable num2: ' || num2);
   END; 
END;
/

执行后,将会产生以下结果:

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声明变量的语法如下:

 .%TYPE;

如果中定义的列名。

考虑一个声明。

SALARY EMP.SAL % TYPE;

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

示例:

DECLARE  
SALARY EMP.SAL % TYPE;
ECODE EMP.empno % TYPE; 
BEGIN   
Ecode :=&Ecode
Select SAL into SALARY from EMP where EMPNO = ECODE;
dbms_output.put_line('Salary of ' || ECODE || 'is = || salary');  
END;

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

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

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

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

 .ROW%TYPE;

Where 是在中定义的变量。

考虑一个声明。

EMPLOYEE EMP. % ROW TYPE;

这个声明将声明一个名为EMPLOYEE的记录,其字段名称和数据类型与EMP表中的列相同。您可以访问EMPLOYEE记录的元素,如下所示:

EMPLOYEE.SAL := 10000;

EMPLOYEE.ENAME := ‘KIRAN’;

示例:

DECLARE  
EMPLOYEE EMP. % ROW TYPE;
BEGIN   
EMPLOYEE.EMPNO := 2092;
5   EMPLOYEE.ENAME := 'Sanju';
Insert into EMP where (EMPNO, ENAME) Values (employee.empno, employee.ename);
dbms_output.put_line('Row Inserted');  
END;

执行后,将会产生以下结果:

Row Inserted
PL/SQL procedure successfully completed.  

优势:

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

本文链接:http://so.lmcjl.com/news/18191/

展开阅读全文