declare
type t_indexby is table of number
index by binary_integer;
type t_nested 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的学习更应如此。 以前的庸惰,我今天还是还叻。 “走江湖的,迟早要还的”。

-----------------------------------------------------------------------------------------------------------------------

方法 描述 使用限制
COUNT 返回集合中元素的个数
DELETE 删除集合中所有元素
DELETE() 删除元素下标为x的元素,如果x为null,则集合保持不变          对VARRAY非法
DELETE(,) 删除元素下标从X到Y的元素,如果X>Y集合保持不变             对VARRAY非法
EXIST() 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND 在集合末尾添加一个元素                                       对Index_by非法
EXTEND() 在集合末尾添加x个元素                                      对Index_by非法
EXTEND(,) 在集合末尾添加元素n的x个副本                              对Index_by非法
FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.
LIMIT 返回VARRY集合的最大的元素个数,对于嵌套表和对于嵌套表和Index_by为null Index_by集合无用
NEXT() 返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null.
PRIOR() 返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。
TRI M 从集合末端开始删除一个元素                                    对于index_by不合法
TRIM() 从集合末端开始删除x个元素                                    对index_by不合法

oracle 的数组(转)的更多相关文章

  1. Oracle之数组

    记忆力不好,提供样例套路: 固定长度数组: declare type t_test ) ); test t_test := t_test('a', 'b', 'c', 'd', 'e'); begin ...

  2. oracle 之 数组、嵌套表、SQL查询式 实现多表数据for循环插入指定表

    1.基础环境 创建基础表: CREATE TABLE TEST_TAB1( ID INT, NAME VARCHAR2(20) ); CREATE TABLE TEST_TAB2( ID INT, N ...

  3. 数组做为参数传入Oracle存储过程操作数据库

    p { margin-bottom: 0.25cm; direction: ltr; color: rgb(0, 0, 0); line-height: 120%; text-align: justi ...

  4. 通过数组方式向Oracle大批量插入数据(10万条11秒)

    1.创建数据库Person CREATE TABLE Person( id number, name nvarchar2() , age number , sex nvarchar2() , pass ...

  5. MySQL与Oracle 差异比较之七其它

    其它 编号 类别 ORACLE MYSQL 注释 1 内连接的更改 1.select a.*, b.*, c.*, d.*  from a, b, c, d where a.id = b.id   a ...

  6. Oracle Data Provider for .NET 的使用经验

    原文:Oracle Data Provider for .NET 的使用经验 Oracle Data Provider for .NET 是Oracle提供的基于Ado.net接口的一个开发包.    ...

  7. 对oracle用户创建asm磁盘

    --root用户执行vi /etc/sysctl.conf #Install oracle settingfs.aio-max-nr = 1048576fs.file-max = 6815744#ke ...

  8. [ SHELL编程 ] 数组、关联数组和awk数组

    本文主要对shell编程中常用的数组.关联数组和awk数组定义.操作以及注意事项做个总结,并提供具体案例. 数组 数组定义:一对圆括号表示数组,数组元素之间用空格符号分割. Array=(val1 v ...

  9. oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)

    语句的执行环境是plsql的sql窗口, 语句的目的是从整个数据库中的所有表判断 不等于某个字段的记录数 . 代码如下: declare s_sql clob:=''; -- 声明一个变量,该变量用于 ...

随机推荐

  1. python学习之map函数和reduce函数的运用

    MapReduce:面向大型集群的简化数据处理引文 map()函数 Python中的map()函数接收两个参数,一个是调用函数对象(python中处处皆对象,函数未实例前也可以当对象一样调用),另一个 ...

  2. 1016-06-首页20-封装工具条-有控件在viewDidLoad的时候距离顶部是0--到了viewWillAppear或viewDidAppear系统就加了64

  3. 初见spark-03(高级算子)

    最近心情不是很好,但是需要调节自己,真的需要调节自己,还是要努力,这个世界有我喜欢的人,有我追求的人,也许真的是守的住寂寞,耐得住繁华吧. 不说别的了,今天我们来接受啊spark的高级算子的系列 1. ...

  4. 大话目标检测经典模型(RCNN、Fast RCNN、Faster RCNN)

      目标检测是深度学习的一个重要应用,就是在图片中要将里面的物体识别出来,并标出物体的位置,一般需要经过两个步骤:1.分类,识别物体是什么 2.定位,找出物体在哪里 除了对单个物体进行检测,还要能支持 ...

  5. 使用Autofac实现依赖注入注入

    依赖注入是什么意思? 依赖倒置 在软件设计原则中,有一种重要的思想叫做依赖倒置.它的核心思想是:不能让高层组件依赖底层组件,而且,不管高层组件和底层组件,两者都应依赖于抽象.那么,这个原则和我们上面的 ...

  6. sublimeText3快捷键

      Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+V:粘贴 ...

  7. 《Cracking the Coding Interview》——第11章:排序和搜索——题目8

    2014-03-21 22:23 题目:假设你一开始有一个空数组,你在读入一些整数并将其插入到数组中,保证插入之后数组一直按升序排列.在读入的过程中,你还可以进行一种操作:查询某个值val是否存在于数 ...

  8. 打包成apk,生成apk文件,上传到网站服务器提供链接下载

    Android开发把项目打包成apk: 做完一个Android项目之后,如何才能把项目发布到Internet上供别人使用呢?我们需要将自己的程序打包成Android安装包文件--APK(Android ...

  9. Pascal小游戏 双人射击

    一个双人的游戏 Pascal源码附上 只要俩人不脑残,一下午玩不完...又是控制台游戏中的一朵奇葩. Free Pascal 射击游戏 Program shooting_game; uses crt; ...

  10. 【Luogu P2257】YY 的 GCD

    题目 求: \[ \sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) \in \mathbb P] \] 有 \(T\) 组数据, \(T\le 10^4, n, m\ ...