1、声明变量
可以使用下面两种语法声明变量:
variable_name data_type [ [ not null] := default_value_expression];
variable_name data_type [ [ not null] default_value_expression];
和其他语言相似,变量名必须满足如下条件:
- 长度不能超过30个字符,并且中间不能有空格
- 由字母、0到9的数字、下划线"_"、美元符号"$" 以及"#"号组成
- 必须有字母开头
- 不能使用PL/SQL或SQL中的关键字,如:begin, end。
变量类型 data_type 决定了其中存储的数据类型。如果变量只能存储一个单独的值,则该变量称为标量变量。如果变量可以粗出多个值(如表中的一行记录),则该变量称为符合类型的变量。
标量量变量所使用的数据类型包括字符、数字、日期和布尔类型等。
not null 表示变量必须是非空的,需要指定初始值。当变量被创建后,可以以表达式的方式对其赋初始值。在声明变量时,也可以使用default关键字指定变量的默认值。如果变量未赋值,则使用默认值。
declare
out_date data;
out_text varchar2(100);
out_num number(10);
out_boolean boolean;
2、 %TYPE 类型变量
在声明变量时,除了可以使用Oracle规定的数据类型,还可以使用%type关键字定义变量类型。
declare var_name emp.ename%TYPE
%type 关键字的含义是声明一个与指定列名称相同的数据类型。如果emp表ename字段类型为varchar2(64),那么变量var_name的数据类型也是varchar2(64)。
SQL> set serveroutput on
SQL> declare
2 var_no emp.empno%type;
3 var_name emp.ename%type;
4 var_sal emp.sal%type;
5 begin
6 select empno, ename, sal
7 into var_no, var_name, var_sal
8 from emp
9 where empno='7369';
10
11 dbms_output.put_line(var_no || ' | ' || var_name || ' | ' || var_sal);
12 end;
13 /
7369 | SMITH | 800
PL/SQL 过程已成功完成。
上边的例子从emp表查询出数据,赋值给三个变量,同时打印变量值。同时,定义的变量只可以存储一个值,所有加上了条件,只返回一条记录。如果返回的是多条记录,则会产生错误。
使用%type 关键字定义变量的好处很明显:首先,不需要去查看表中列的类型,就可以定义合适长度,大小的变量;其次,具有较好的扩展性,如果表结构有变更,%type会自动调整,不需要我们手动修改。缺点是必须查看数据字典去确定变量类型,对性能会产生影响。
3、复合变量
标量标量只能存储一个值,如果要存储多个值,则需要复合变量。对于复合变量,用户可以根据需要定义结构,也可以使用系统自动决定的变量结构。
自定义记录类型
自定义记录类型的语法如下:
type record_name is record (
field_name data_type [not null] [:= default_value],
……
field_name data_type [not null] [:= default_value]
);
type 为自定义记录类型的关键字,record_name 为数据类型名,field_name为记录数据类型中的字段名,data_type为该字段的数据类型。
SQL> set serveroutput on
SQL> declare
2 type employee_type is record (
3 var_no number,
4 var_name varchar2(20),
5 var_sal number);
6 employee employee_type;
7 begin
8 select empno, ename, sal
9 into employee
10 from emp
11 where empno='7369';
12
13 dbms_output.put(employee.var_no);
14 dbms_output.put(' | ' || employee.var_name);
15 dbms_output.put_line(' | ' || employee.var_sal);
16 end;
17 /
7369 | SMITH | 800
PL/SQL 过程已成功完成。
%ROWTYPE类型
%rowtype的用法和 %type类似。
SQL> set serveroutput on
SQL> declare
2 row_employee emp%rowtype;
3 begin
4 select *
5 into row_employee
6 from emp
7 where empno = '7499';
8
9 dbms_output.put(row_employee.empno);
10 dbms_output.put(' | ' || row_employee.ename);
11 dbms_output.put(' | ' || row_employee.job);
12 dbms_output.put_line(' | ' || row_employee.sal);
13 end;
14 /
7499 | ALLEN | SALESMAN | 1600
PL/SQL 过程已成功完成。