PL/SQL中的变量

Posted by 道行尚浅 on January 6, 2008

PL/SQL的标识符

PL/SQL中的标识符与SQL中相同,要求如下

  1. 最长为30个字符
  2. 可使用A-Z,a-z,0-9,_,#,$字符
  3. 首位必须是字母
  4. 不可以是Oracle保留字

变量的声明与初始化

变量在声明部分声明,并可在声明后直接赋值,这种行为我们称之为初始化. 也可在可执行部分赋值,这种行为我们称之为赋值

declare
v1 number :=0 ; --初始化
v2 number  ;  
begin
 v2 :=1 ;        --赋值
 dbms_output.put_line(v1);
 dbms_output.put_line(v2);
end ;

常量

通过constant关键字声明常量

declare
  v1 constant number := 100;
begin
  dbms_output.put_line(v1);
end;
    /

执行结果

100

PL/SQL procedure successfully completed

  • 常量必须初始化
SQL> declare
  2  v1   constant  number ;
  3  begin
  4  dbms_output.put_line(v1);
  5  end ;
  6  /

declare
v1   constant  number ;
begin
dbms_output.put_line(v1);
end ;

ORA-06550: line 2, column 1:
--下面这行报错的含义是:常量'v1 必须有一个初始化的值
PLS-00322: declaration of a constant 'V1' must contain an initialization assignment 
ORA-06550: line 2, column 6:
PL/SQL: Item ignored

  • 常量不可在执行部分进行赋值
  SQL> declare
  2  v1   constant  number :=100 ;
  3  begin
  4  v1 :=200 ;
  5  dbms_output.put_line(v1);
  6  end ;
  7  /

declare
v1   constant  number :=100 ;
begin
v1 :=200 ;
dbms_output.put_line(v1);
end ;

ORA-06550: line 4, column 1:
--下面这行报错的含义是:表达式'V1' 不能作为一个赋值对象
PLS-00363: expression 'V1' cannot be used as an assignment target
ORA-06550: line 4, column 1:
PL/SQL: Statement ignored

变量的作用域

由于PL/SQL语句块可以进行嵌套,即父块可以包含子块,子块可以包含子子块.

正是由于PL/SQL中存在这种多层结构,我们有必要搞清楚变量的作用域.

变量作用域的规则:

  • 父块声明的变量可以被子块引用
  • 子块声明的变量不可以被父块引用
  • 兄弟块之间的变量不可引用
  • 如果子块与父块之间存在同名变量,子块在引用变量时需要借助标签
--父块
declare
v1 number :=1 ;
begin
 --子块
 declare
 v2 number :=2 ;
 begin
   dbms_output.put_line(v1); --子块中引用父块声明的变量
   dbms_output.put_line(v2);
 end ;
end ;

执行结果

1
2

PL/SQL procedure successfully completed


--父块
declare
v1 number :=1 ;
begin
 --子块
 declare
 v2 number :=2 ;
 begin
   dbms_output.put_line(v1);
   dbms_output.put_line(v2);
 end ;
 -- 父块中引用子块的变量引起报错
  dbms_output.put_line(v2);
end ;

ORA-06550: line 11, column 24:
PLS-00201: identifier 'V2' must be declared
ORA-06550: line 11, column 3:
PL/SQL: Statement ignored



declare
v1 number :=1 ;
begin
 --子块1
 declare
 v2 number :=2 ;
 begin
   null;
 end ;
 --子块2
 declare
 v3 number :=2 ;
 begin
   --子块2引用兄弟块子块1的变量,引起报错
   dbms_output.put_line(v2);
 end ;
end ;

ORA-06550: line 14, column 25:
PLS-00201: identifier 'V2' must be declared
ORA-06550: line 14, column 4:
PL/SQL: Statement ignored


<<parent_block>>
    declare
    v1 number :=1 ;
    begin
     declare
     v1 number :=2 ;
     begin
     --使用标签引用父块变量
        dbms_output.put_line(parent_block.v1);
     end ;
   end ;

执行结果

1

PL/SQL procedure successfully completed.