关于ORACLE复合类型的用法的总结

来源:互联网 发布:数据分析证书有哪些 编辑:程序博客网 时间:2024/06/04 19:04

关于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;