PL/SQL复合类型变量

      Oracle在PL/SQL中提供了复合数据类型,用于存放多个值,定义复合变量时需要使用PL/SQL的复合数据类型,主要有这四种:记录类型、自定义表、嵌套表、VARRAY。

      1.记录类型

      这种数据类型类似于C语言中的结构体,每个记录类型一般会包含多个成员变量,在使用记录类型变量时需要在声明部分定义record类型和变量,随后在执行部分才可使用。示例代码如下:

declare 
  type emp_record is record(
        v_name emp.ename%type,
        v_sal emp.sal%type,
        v_job emp.job%type);
        v_emp emp_record;
begin
        select ename,sal,job into v_emp from emp where empno='7788';
        dbms_output.put_line('emp_name:'||v_emp.v_name);
end;

      以上代码定义了一个emp_record记录类型,在这个记录类型中包含三个成员变量,v_emp则引用了emp_record这个记录类型作为变量,在使用时需要通过记录变量前缀来使用记录类型的成员。

      2.自定义表

      自定义表类似于C语言中的数组,但是PL/SQL中自定义的表下标可以为负值。并且,高级语言中数组元素个数会受到数据类型最大长度的限制,但是PL/SQL自定义表的元素个数没有限制,且下标没有上下界限。使用自定义表时,必须先定义自定义表类型和表变量,执行部分中即可使用表变量。示例如下:

declare
  type emp_table is table of emp%rowtype
       index by binary_integer;
  v_emp emp_table;
begin
  select * into v_emp(-1) from emp where empno='7788';
  dbms_output.put_line('emp_name:'||v_emp(-1).ename);
end;

       以上示例定义了一个自定义表类型emp_table,表中存放的元素类型是emp表的行记录,以v_emp作为该自定义表类型的表变量,v_emp(index)表示表变量中特定下标的元素,引用元素成员变量时需要使用元素名作为前缀。

      3.嵌套表

      嵌套表就是表中的子表,在主表中表示为一列,对应于主表的每一条记录,嵌套子表可以包含多行。使用嵌套表时,避免了联表查询就可以直接访问子表中的对应记录。如下,示例说明了嵌套表的定义:

--创建类型emp_type,记录员工的基本信息
create or replace type emp_type as object(
       v_name varchar2(10),
       v_sal number(6,2),
       v_hire date);
--创建类型emp_array,这个类型是嵌套表引用的基础类型
create or replace type emp_array is table of emp_type;
--创建部门信息表,将员工信息类型emp_array作为子表进行嵌套
create table t_dept(
       deptno number(2),
       dname varchar2(10),
       t_emp emp_array
       ) nested table t_emp store as t_emp;

       嵌套表的使用:

--向嵌套表中插入数据       
insert into t_dept 
       values(68,'Security',emp_array(emp_type('yanh',9000,sysdate),
                                                     emp_type('helen',9200,sysdate),
                                                     emp_type('chalin',7800,sysdate)));
--嵌套子表不能单独查询,但可以使用hint指令查询
SELECT /*+NESTED_TABLE_GET_REFS+*/ NESTED_TABLE_ID, v_name,v_sal,v_hire FROM  t_emp;

       以上示例表明,在使用嵌套表作为表列时,必须制定特定的存储表,否则使用hint指令查询子表时将无法查询制定的存储列id。

      4.VARRAY

      VARRAY类似于嵌套表,可以作为表中的某一列存储。通常被称为变长数组,与嵌套表不同的是,嵌套表中的元素个数是没有限制的,但是变长数组中的元素个数有限制。使用时,需要先建立VARRAY类型,示例如下:

--建立VARRAY类型
CREATE TYPE res_type as object(
       v_nm varchar2(30),
       v_date date);
CREATE TYPE res_array is VARRAY(5) of res_type;
CREATE TABLE t_res(
       id number(6),
       comm varchar2(10),
       v_res res_array);
insert into t_res values
       (1,'first',res_array(res_type('abc',sysdate),
                                 res_type('def',sysdate)));

       VARRAY数据在存储时与表中其它列一起存放在同一张表中,并不需要为其指定单独的存储表。

你可能感兴趣的:(pl/sql)