关于ORACLE中的复合类型有:记录和集合(索引表,嵌套表,VARRAY)
一、集合
1 VARRAY
(1)自定义数据类型:
CREATE TYPE 类型名 IS VARRAY(52) OF VARCHAR2(20);
(2)来自表的某个字段:
CREATE TYPE 类型名 IS VARRAY(52) OF 表名.字段%TYPE;
注意:使用VARRAY时一定要先指定数组大小
例子:
===================================================================================
declare
type var_type is varray(10) of varchar2(30);
v_var var_type :=var_type();
begin
select ename bulk collect into v_var from emp where comm>0;
for i in 1..v_var.count loop
dbms_output.put_line('ename='||v_var(i));
end loop;
end;
2 嵌套表:
TYPE 类型名 IS TABLE OF 具体类型如:(表名%ROWTYPE);
3.索引表:
跟嵌套表相似,不同的是有末尾加上了INDEX BY BINARY_INTEGER。
例子:
===================================================================================
--嵌套表的用法
Create Or Replace Procedure lunartest2 Is
TYPE NumTab IS TABLE OF emp.empno%TYPE;
TYPE NameTab IS TABLE OF emp.ename%TYPE;
enums NumTab; -- no need to initialize
names NameTab;
BEGIN
SELECT empno, ename BULK COLLECT INTO enums, names FROM emp;
FOR i in enums.FIRST .. enums.LAST LOOP
DBMS_OUTPUT.PUT_LINE(enums(i) || ' ' || names(i));
END LOOP;
END;
嵌套表的元素可以是集合,注意赋值的时候是varray_element.record_column := 的形式.
除了构造函数外,集合还有很多内建函数,按照面向对象编成的叫法称之为方法。
方法==========描述====================================================================使用限制
COUNT=========返回集合中元素的个数
DELETE========删除集合中所有元素
DELETE(x)=====删除元素下标为x的元素===================================================对VARRAY非法
DELETE(x,y)===删除元素下标从X到Y的元素================================================对VARRAY非法
EXIST(x)======如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND========在集合末尾添加一个元素==================================================对Index_by非法
EXTEND(x)=====在集合末尾添加x个元素===================================================对Index_by非法
EXTEND(x,n)===在集合末尾添加元素n的x个副本============================================对Index_by非法
FIRST=========返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST==========返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.
LIMIT=========返回VARRY集合的最大的元素个数===========================================Index_by集合和嵌套表无用
NEXT(x)=======返回在第x个元素之后及紧挨着它的元素的值,如果x是最后一个元素,返回null.
PRIOR(x)======返回在第x个元素之前紧挨着它的元素的值,如果x是第一个元素,则返回null。
TRIM==========从集合末端开始删除一个元素==============================================对于index_by不合法
TRIM(x)=======从集合末端开始删除x个元素===============================================对index_by不合法
********************************************************************************************
二、记录
1.显式记录定义:
TYPE 类型名 IS RECORDER (具休类型)
2.隐式记录定义用%ROWTYPE.
变量名 表名%ROWTYPE(隐式定义)
例子:
隐式定义记录中,我们不用描述记录的每一个域,在声明记录变量时使用%ROWTYPE命令定义与数据库表,视图,游标有相同结构的记录。
有一些PL/SQL指令在使用隐式定义记录时没有使用%ROWTYPE属性,比如游标FOR循环或触发器中的:old和:new记录
--用记录:只能提取单条的记录,要提取多条记录时要用游标
===============================================
declare
--显式的记录
TYPE t_record IS RECORD (
id number(18,0),
name varchar2(50)
);
var_record t_record;
--隐式的记录
var_rec emp%rowtype;
begin
select empno,ename into var_record from emp where empno='7369';
dbms_output.put_line(var_record.id||'---'||var_record.name);
select * into var_rec from emp where empno='7369';
dbms_output.put_line(var_rec.empno||'---'||var_rec.ename);
exception when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
======================================================================================
三、综合实例BULK COLLECT的用法
注:bulk collect into 是用来保存多纪录到变量中。
set serverout on
DECLARE
TYPE t_record IS RECORD (
id number(18,0),
name varchar2(50)
);
var_record t_record; --定义记录
type t_test is table of t_record; --定义记录型的嵌套表(相当于构建成游标)
var_test t_test := t_test(); --定义变量时初始化为空
cursor cur_test is select empno,ename from emp;
begin
--用游标的方式
open cur_test;
fetch cur_test BULK COLLECT INTO var_test;
for i in 1..var_test.count() loop
dbms_output.put_line(var_test(i).id||'---'||var_test(i).name);
end loop;
end;