`

PL/SQL集合

 
阅读更多


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 数组的官方介绍 
分享到:
评论

相关推荐

    pl/sql集合相关例子

    pl/sql集合相关例子,可做参考,包括数组,记录,表,对象的各种使用方法和相关函数

    PL/SQL 用户指南与参考

    第五章 PL/SQL集合与记录 第六章 PL/SQL与Oracle间交互 第七章 控制PL/SQL错误 第八章 PL/SQL子程序 第九章 PL/SQL包 第十章 PL/SQL对象类型 第十一章 本地动态SQL 第十二章 PL/SQL应用程序性能调优

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    PL/SQL Developer 6.05注册版-1

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    精通Oracle 10g SQL和PL/SQL

    sql是关系数据库的基本操作语言 它是应用程序与数据库进行交互操作的接口 pl/sql是oracle特有的编程语言 它不仅具有过程编程语言的基本特征 循环 条件分支等 而且还具有对象编程语言的高级特征 重载 继承等 ...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    PL/SQL Developer v8.0.zip

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    Oracle PL/SQL语言初级教程

    PL/SQL集合 23 嵌套表 24 使用集合 25 集合的方法 28 关于集合之间的比较 29 3.PL/SQL单行函数和组函数详解 29 单行字符串函数 30 单行转换函数 37 SQL中的组函数 40 嵌套函数 42 4.Oracle数据库数据对象分析(上)...

    Oracle Advanced PL/SQL Developer Professional Guide

    集合,外部过程,服务器端结果缓存,使用VPD强制行级安全性,处理大型对象和SecureFiles等功能为PL / SQL专业人员构建了一个具体平台。除了编程之外,本书还提供了有关开发工具SQL Developer的使用的工具建议,采用...

    PL/SQL Developer 7.1.5 注册版-3

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    精通Oracle 10g PL/SQL编程

    通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和大对象类型)。另外,本书还为应用开发人员提供了大量...

    PL/SQL经典介绍

    第五章 PL-SQL集合与记录(1) 第六章 PL-SQL集合与记录(2) 第七章 PL-SQL与Oracle间交互 第八章 控制PL-SQL错误 第九章 PL-SQL子程序 第十章 PL-SQL包 第十一章 PL-SQL对象类型 第十二章 本地动态SQL 第十三章 PL...

    Oracle PL/SQL程序设计(第5版)(下册) 第一部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

    读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录类型、集合类型...

    PL-SQL用户指南与参考

    · 第五章 PL/SQL集合与记录(2) 2008-04-08 · 第五章 PL/SQL集合与记录(1) 2008-04-08 · 第四章 PL/SQL的控制结构 2008-04-08 · 第三章 PL/SQL数据类型 2008-04-08 · 第二章 PL/SQL基础 2008-04...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的作用及使用方法,而且可以掌握SQL语句和PL/SQL的各种基础知识和高级特征(记录类型、集合类型...

    PL/SQL Developer

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    pl/sql developer 9 + 注册机

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

Global site tag (gtag.js) - Google Analytics