Oracle 数组的学习 小知识也要积累,养成好的学习态度
来源:asp之家 发布时间:2009-08-04 12:42:00
提叻一个代码段,要人帮助解释一下。
代码如下:
declare
type t_indexby is table of number
index by binary_integer;
type t_nesteed is table of number;
type t_varray is varray(10) of number;
v_indexby t_indexby;
v_nested t_nested;
v_varray t_varray;
begin
v_indexby(1):=1;
v_indexby(2):=2;
v_nested:=t_nested(1,2,3,4,5);
v_varray:=t_varray(1,2);
end;
一段很简单的有关Oracle里数组的sample代码。看着这段由代表性的代码,不由想起自己以前独 * 索Oracle里数组类型的那种不弄明白决不姑息的激情。
这段代码也还不错,通过简单的实例就把主要的数组类型都罗列出来叻,好的素材 不由又激发其我回答写写的欲望叻,所以也不吝指力,总结叻一番,也顺便填补一下我以前忘记归纳总结的空缺
这段代码,收罗叻Oracle里数组的使用方式
1. index by table
2. nested table
3. varray 可变数组
这里是Oracle文档里对这三种数组类型的介绍
An index-by table is the most flexible and generally best-performing 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(10) 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(1):=1;
v_indexby(2):=2;
这里分别在v_indexby里加了两个元素,为1, 1和2,2,注意这里的(1),(2)和后面nested table已经varray里的不一样, 这里,我把它理解为key,而不是元素的序号。所以index by这里的下标,不一定是连续的,可以跳跃,而另两者就不同,另外两个是名符其实的数组对象了,下标表示的就是元素的序号,和java不同,从1开始。
v_nested:=t_nested(1,2,3,4,5);
v_varray:=t_varray(1,2);
这里分别是定义了5个和2个元素的数组。
v_nested:=t_nested(1,2,3,4,5); 5个元素,值为1,2,3,4,5
v_varray:=t_varray(1,2); 2个元素 值为1,2
强调一下,对于nested table来说,需要使用extend来扩展数组,添加元素的时候,而varrray不需要(已经知道长度了,定义的时候)。
v_nested.extend; v_nested(v_nested.count) := 6;
大家在这里基本上已经可以看到他们的区别了,index by table在结构上和nested table以及Varray有着本质的不同,那么势必使用的时候肯定不同了。由于index by table下标并不是序号,所以我们只能通过key来访问了,这里和java倒是一样的。
上面的例子里,没有提供,而且我在网上找了很多的介绍都没有详细给出过index by table的遍历的方法的,这里我自己写了一个sample,供大家学习参考
代码如下:
declare
type t_array is table of varchar2(1000) index by binary_integer;
v_array t_array;
v_idx number;
begin
v_array(1) := 'a1';
v_array(2) := 'a2';
v_array(-1) := 'a-1'; -- 是key所以可以为负数
v_idx := v_array.first;
loop
exit when v_idx is null;
dbms_output.put_line(v_array(v_idx));
v_idx := v_array.next(v_idx);
end loop;
end;
/
结果
a-1
a1
a2
注意这里的方法,first,返回第一个key,next()返回下一个key
对于nested table来说,下标是序号,是不能为负数的
代码如下:
declare
type t_array is table of varchar2(1000);
v_array t_array;
v_idx varchar2(1000);
begin
v_array := t_array(); --- 一定要先初始话。
v_array.extend; ---- 扩展数组
v_array(1) := 'a1';
v_array.extend;
v_array(2) := 'a2';
v_array.extend;
v_array(3) := 'a-1'; ---- v_array(-1) := 'a-1'; 将出错
v_idx := v_array.first;
loop
dbms_output.put(v_idx||' ');
exit when v_idx is null;
dbms_output.put_line(v_array(v_idx));
v_idx := v_array.next(v_idx);
end loop;
end;
/
看看nested tabled的访问也可以和上面一样,当然也可以用更简单的方法来遍历
代码如下:
for i in 1..v_array.count loop
dbms_output.put(i||' ');
dbms_output.put_line(v_array(i));
end loop;
其实可以看到和java里的list的访问很类似了。
这个知识点,很多人都写过sample,内容不是很多,但是小知识也要积累,劝学里 “不积跬步,无以至千里,不积小流,无以成江海”,学习固然如此,而Oracle的学习更应如此。 以前的庸惰,我今天还是还叻。 “走江湖的,迟早要还的”。
Oracle对Index by 数组的官方介绍
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm#insertedID8
猜你喜欢
- ADO对象: Connection Command Recordset Record Stream ASP支持的对象很多,可以自己编写COM
- 如何验证日期输入是否正确?我们可以利用ASP 3.0里的On Error Resume Next来完成这项功能:<%Option&nb
- 代码如下:declare @cmd nvarchar(4000) set @cmd = N'exec [?].sys.sp_chan
- 如何远程读取数据库页面?见下:<%Set HttpObj = Server.CreateObject(&
- 今天在看见了一堆不错的非洲的web 2.0网站的Logo,于大家一起欣赏:非洲web2.0网站的logo大部分和平时看见的web2.0网站l
- Microsoft? SQL Server? 2000 的可用版本如下:SQL Server 2000企业版作为生产数据库服务器使用。支持
- 很多时候,设计师们都会通过各种渠道去了解用户的需求,然而从这些渠道反馈回来的信息大部分只是用户的期望并不是真正的用户需求,但是很多时候这些期
- 问题描述:使用 SQL 2005 w/ SP2 的汇出汇入精灵将数据从 Access 汇入到 SQL2005 发生了错误,但使用在SQL 2
- 在实际的数据库应用中,我们经常遇到这样一个问题,连接到Oracle数据库的用户在作了一次操作后,再也没有后续操作,但却长时间没有和数据库断开
- 利用XMLHTTP无刷新自动实时更新数据,2秒自动刷新一次,2秒取得一次数据.demo.htm 前台显示<script la
- 今天偶然看到“一个有将近两年的div + CSS 开发经验和历史,曾经是Web标准绝对拥趸的同志”在自己的blog上发表放弃div+css的
- 本站收集的js实现的同步动态显示当前日期,时间和星期几的代码,我经常用在自己做的企业网站的后台,方便嘛。效果可以看看本站的首页,呵呵!而且代
- 在MySQL数据库中导出整个数据库:1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldu
- <!--#include file="config.asp" -->&nbs
- 1.函数array()功能:创建一个数组变量格式:array(list)参数:list为数组变量中的每个数值列,中间用逗号间隔例子:<
- ExpiresAbsolute 属性指定缓存于浏览器中的页的到期日期和时间语法Response.ExpiresAbsolute [
- 在Dreamweaver4中,你可以存储你自己设定的图片、链接、flash影片、颜色表、模板等等,组成这个站点的资产,这就是Assets面板
- 据国外媒体报道,相较于IE8浏览器,微软最新一代浏览器IE9的最大改进就是硬件加速HTML5。微软承诺,通过利用IE9中的硬件加速功能,开发
- 在SQL Server 中,如果给表的一个字段设置了默认值,就会在系统表sysobjects中生成一个默认约束。如果想删除这个设置了默认值的
- 用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“