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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值