Oracle 学习笔记8 —— PL/SQL 定义变量

来源:互联网 发布:ubuntu 16.04 xampp 编辑:程序博客网 时间:2024/05/16 18:49
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 onSQL> 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 | 800PL/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 onSQL> 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 | 800PL/SQL 过程已成功完成。

%ROWTYPE类型

%rowtype的用法和 %type类似。

SQL> set serveroutput onSQL> 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 | 1600PL/SQL 过程已成功完成。

原创粉丝点击