3.2 PL/SQL中的变量

在PL/SQL块中可以定义变量和数据类型,这使得PL/SQL块对数据的处理更加灵活。变量和类型的定义放在PL/SQL块的变量声明部分。

3.2.1 变量的定义与使用

变量的定义有两种格式,分别为:


变量名 类型[约束][DEFAULT默认值]

变量名 类型[约束][:=初始值]


其中用方括号限定的部分是可选的。约束用来规定变量必须满足的条件,比如“NOT NULL”约束指定变量不能为空值,这样在定义变量的时候就要为其指定初始值或默认值。

变量名要遵守一定的命名规则。变量名必须以字母开头,包含数字、字母、下划线以及$、#符号,长度不能超过30字符,并且不能与Oracle关键字相同。变量名与大小写是无关的。

变量的类型可以是PL/SQL提供的数据类型,也可以是用户自定义的类型。表3.1列出了基本的数据类型。

figure_0087_0019

除了上述基本类型外,PL/SQL还定义了一些子类型。在PL/SQL块中既可以使用这些基本数据类型,也可以使用它们的子类型,但数据的最终类型仍然是它的基本类型。表3.2列出了部分数据类型的子类型。

figure_0088_0020

变量在定义时可以指定默认值或初始值,在PL/SQL块的运行过程中还可以为其赋值。赋值的格式为:


变量名:=表达式


如果需要输出变量的值,则要调用DBMS_OUTPUT程序包中的过程PUT_LINE,这个过程的参数是要输出的变量或表达式。除了变量的声明外,变量的赋值、输出等操作都要放在PL/SQL块的可执行部分。下面的代码演示了变量的声明、赋值和输出操作。


DECLARE

id integer NOT NULL DEFAULT 100;

name varchar2(20):='SMITH';

birthday date DEFAULT SYSDATE;

BEGIN

id:=200;

dbms_output.put_line('id的值为:'||id);

dbms_output.put_line('name的值为:'||name);

dbms_output.put_line('birthday的值为:'||birthday);

END;


上述代码的执行结果与下面类似:


SQL>/

id的值为:200

name的值为:SMITH

birthday的值为:03-9月-04


在输出变量之前,要确保SQLPlus的输出是打开的,否则将得不到输出结果。也就是说,首先要在SQLPlus中对参数SERVEROUTPUT进行设置:


SQL>SET SERVEROUTPUT ON


PL/SQL块的代码可以直接在“SQL>”提示符下输入。输入结束后,执行命令“/”即可使该PL/SQL块开始执行。如果发现代码执行时有错误,可以输入“ed”命令进行修改。通过“ed”命令将打开一个文本编辑器,对缓冲区中的内容进行编辑。编辑完后重新输入命令“/”,可以再次执行PL/SQL块。

在定义变量时,除了直接为变量指定类型外,还可以通过%TYPE属性为变量指定类型,%TYPE用于获得另一个变量或者表中某个列的类型,使得新定义的变量与该变量或该列的类型完全一致。%TYPE属性的用法为:


变量名 另一变量%TYPE

变量名 表.列%TYPE


使用%TYPE属性的一个好处是当原来的变量或列的类型被修改后,不需要修改新变量的类型。另一个好处是,我们只希望一个变量与另一个变量的类型相同,但是我们可以不关心它到底是什么类型。例如:


id integer DEFAULT 100;

no id%TYPE;

name emp.ename%TYPE;


在上述例子中,首先定义了一个变量id,然后定义了一个变量no,通过%TYPE属性使变量no的类型与id变量的相同。最后又定义了变量name,它的类型与emp表中的列ename的类型一致。