PL/SQL 专题
您的位置:database > PL/SQL专题 > PL/SQL变量
PL/SQL变量
作者:--    发布时间:2019-11-20

在本章中,我们将学习pl/sql中的变量。 一个变量只不过是在程序中可以操纵的存储区域的名称。 pl/sql中的每个变量都有一个指定的数据类型,它决定了变量内存的大小和布局; 可以存储在存储器中的值的范围以及可应用于该变量的一组操作。

pl/sql变量的名称由可选的字母,数字,美元($)符号,下划线和数字符号组成,不能超过30个字符。 默认情况下,变量名不区分大小写。不能将保留的pl/sql关键字用作变量名称。

pl/sql编程语言允许定义各种类型的变量,如:日期时间数据类型,记录,集合等,我们将在后面的章节中介绍。 在本章中仅学习基本的变量类型。

pl/sql变量声明

必须在声明部分或包中声明pl/sql变量作为全局变量。当声明一个变量时,pl/sql为变量的值分配内存,并且存储位置由变量名称标识。

声明变量的语法是 -

variable_name [constant] datatype [not null] [:= | default initial_value]

其中,variable_name是pl/sql中的有效标识符,datatype必须是有效的pl/sql数据类型或任何用户定义的数据类型,我们已在上一章中讨论过。一些有效的变量声明及其定义如下所示:

sales number(10, 2); 
pi constant double precision := 3.1415; 
name varchar2(25); 
address varchar2(100);

当使用数据类型提供了大小,比例或精度限制时,称为约束声明。有约束声明比无约束声明需要更少的内存。 例如 -

sales number(10, 2); 
name varchar2(25); 
address varchar2(100);

pl/sql变量初始化

无论何时声明一个变量,pl/sql都会为变量分配一个默认值null。 如果要使用非null值的值初始化变量,则可以在声明期间使用以下任意一种作法 -

  • default关键字
  • 分配运算符

例如 -

counter binary_integer := 0; 
greetings varchar2(20) default 'have a good day';

还可以使用not null约束指定变量不应该具有null值。 如果使用not null约束,则必须为变量显式分配初始值。

初始化变量是一个很好的编程实践,否则有时程序会产生意想不到的结果。下面是使用各种类型的变量的示例 -

declare 
   a integer := 10; 
   b integer := 20; 
   c integer; 
   f real; 
begin 
   c := a + b; 
   dbms_output.put_line('value of c: ' || c); 
   f := 70.0/3.0; 
   dbms_output.put_line('value of f: ' || f); 
end; 
/

当执行上述代码时,会产生以下结果 -

value of c: 30 
value of f: 23.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.

将sql查询结果分配给pl/sql变量

可以使用sql的select into语句将值分配给pl/sql变量。 对于select列表中的每个项目,into列表中必须有一个对应的类型兼容变量。以下示例说明了这个概念。下面首先创建一个名为customers的表 -

create table customers( 
   id   int not null, 
   name varchar (20) not null, 
   age int not null, 
   address char (25), 
   salary   decimal (18, 2),        
   primary key (id) 
);

现在向customers表中插入一些数据记录 -

insert into customers (id,name,age,address,salary) 
values (1, 'ramesh', 32, 'ahmedabad', 2000.00 );  

insert into customers (id,name,age,address,salary) 
values (2, 'khilan', 25, 'delhi', 1500.00 );  

insert into customers (id,name,age,address,salary) 
values (3, 'kaushik', 23, 'kota', 2000.00 );

insert into customers (id,name,age,address,salary) 
values (4, 'chaitali', 25, 'mumbai', 6500.00 ); 

insert into customers (id,name,age,address,salary) 
values (5, 'hardik', 27, 'bhopal', 8500.00 );  

insert into customers (id,name,age,address,salary) 
values (6, 'komal', 22, 'mp', 4500.00 );

以下程序使用sql的select into子句将上表中的值分配给pl/sql变量,

declare 
   c_id customers.id%type := 1; 
   c_name  customers.no.ame%type; 
   c_addr customers.address%type; 
   c_sal  customers.salary%type; 
begin 
   select name, address, salary into c_name, c_addr, c_sal 
   from customers 
   where id = c_id;  
   dbms_output.put_line 
   ('customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal); 
end; 
/

当执行上述代码时,会产生以下结果 -

customer ramesh from ahmedabad earns 2000  

pl/sql procedure completed successfully

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册