数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle 数组的学习 小知识也要积累,养成好的学习态度


发布日期:2024年03月21日
 
Oracle 数组的学习 小知识也要积累,养成好的学习态度
提叻一个代码段要人帮助解释一下

代码段如下

复制代码 代码如下:

declare

type t_indexby is table of number

index by binary_integer;

type t_nesteed is table of number;

type t_varray is varray() of number;

v_indexby t_indexby;

v_nested t_nested;

v_varray t_varray;

begin

v_indexby():=;

v_indexby():=;

v_nested:=t_nested();

v_varray:=t_varray();

end;

一段很简单的有关Oracle里数组的sample代码看着这段由代表性的代码不由想起自己以前独自摸索Oracle里数组类型的那种不弄明白决不姑息的激情

这段代码也还不错通过简单的实例就把主要的数组类型都罗列出来叻好的素材 不由又激发其我回答写写的欲望叻所以也不吝指力总结叻一番也顺便填补一下我以前忘记归纳总结的空缺

这段代码收罗叻Oracle里数组的使用方式

index by table

nested table

varray 可变数组

这里是Oracle文档里对这三种数组类型的介绍

An indexby table is the most flexible and generally bestperforming collection type for use inside PL/SQL programs

A nested table is appropriate for large collections that an application stores and retrieves in portions

A VARRAY is appropriate for small collections that the application stores and retrieves in their entirety

这里是对通过应用性上的对他们三者的概括好像没有给我们太直接的影响还是让我们先对其了解这里的应用性上体现的东西也就好理解叻

sample code中以对三种不同的type定义的方式开始

type t_indexby is table of number index by binary_integer; indexed by table

type t_nesteed is table of number; nested table

type t_varray is varray() of number; varray

上两句和后一句有明显的不同没有定义长度而varray定义叻长度varray有长度限制访问是超过长度的话将提示越界的错误而indexed by table和nested table显然没有这个限制不过对于indexed by table和nested table他们两个也是有区别的

上面sample的后部分就描述了两者的区别对于index by table来说这里已经指定了index的类型直接用index的类型的变量做索引来标识着每个元素而不需要扩展大小这个功能有些像java里的map(有区别就是这里key是有顺序的)而nested table能则完全和list一样

我们通过sample来看看

v_indexby():=;

v_indexby():=;

这里分别在v_indexby里加了两个元素 注意这里的()()和后面nested table已经varray里的不一样

这里我把它理解为key而不是元素的序号所以index by这里的下标不一定是连续的可以跳跃而另两者就不同另外两个是名符其实的数组对象了下标表示的就是元素的序号和java不同开始

v_nested:=t_nested();

v_varray:=t_varray();

这里分别是定义了个和个元素的数组

v_nested:=t_nested(); 个元素值为

v_varray:=t_varray(); 个元素 值为

强调一下对于nested table来说需要使用extend来扩展数组添加元素的时候而varrray不需要(已经知道长度了定义的时候)

v_nestedextend; v_nested(unt) := ;

大家在这里基本上已经可以看到他们的区别了index by table在结构上和nested table以及Varray有着本质的不同那么势必使用的时候肯定不同了由于index by table下标并不是序号所以我们只能通过key来访问了这里和java倒是一样的

上面的例子里没有提供而且我在网上找了很多的介绍都没有详细给出过index by table的遍历的方法的这里我自己写了一个sample供大家学习参考

复制代码 代码如下:

declare

type t_array is table of varchar() index by binary_integer;

v_array t_array;

v_idx number;

begin

v_array() := a;

v_array() := a;

v_array() := a; 是key所以可以为负数

v_idx := v_arrayfirst;

loop

exit when v_idx is null;

dbms_outputput_line(v_array(v_idx));

v_idx := v_arraynext(v_idx);

end loop;

end;

/

结果

a

a

a

注意这里的方法first返回第一个keynext()返回下一个key

对于nested table来说下标是序号是不能为负数的

复制代码 代码如下:

declare

type t_array is table of varchar();

v_array t_array;

v_idx varchar();

begin

v_array := t_array(); 一定要先初始话

v_arrayextend; 扩展数组

v_array() := a;

v_arrayextend;

v_array() := a;

v_arrayextend;

v_array() := a; v_array() := a; 将出错

v_idx := v_arrayfirst;

loop

dbms_outputput(v_idx|| );

exit when v_idx is null;

dbms_outputput_line(v_array(v_idx));

v_idx := v_arraynext(v_idx);

end loop;

end;

/

看看nested tabled的访问也可以和上面一样当然也可以用更简单的方法来遍历

复制代码 代码如下:

for i in unt loop

dbms_outputput(i|| );

dbms_outputput_line(v_array(i));

end loop;

其实可以看到和java里的list的访问很类似了

这个知识点很多人都写过sample内容不是很多但是小知识也要积累劝学里 不积跬步无以至千里不积小流无以成江海学习固然如此而Oracle的学习更应如此 以前的庸惰我今天还是还叻 走江湖的迟早要还的

Oracle对Index by 数组的官方介绍

上一篇:Oracle SQL性能优化系列学习三

下一篇:Oracle 游标使用总结