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数据在存储时与表中其它列一起存放在同一张表中,并不需要为其指定单独的存储表。