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 过程已成功完成。