PL/SQL的标识符
PL/SQL中的标识符与SQL中相同,要求如下
- 最长为30个字符
- 可使用A-Z,a-z,0-9,_,#,$字符
- 首位必须是字母
- 不可以是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.