`
winie
  • 浏览: 222442 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

嵌套表与索引表

SQL 
阅读更多
两者都可以用来存储数组.嵌套表更像通常的数组,因为它的下标固定从1开始,且连续.而索引表的下标可以是 -2147483647..-2147483647之间的任意分散值.
一.代码

创建和遍历嵌套表、索引表

create type t_object as object(name varchar2(12),count number(3);

declare
  type t_table1 is table of t_object;--嵌套表
  type t_table2 is table of t_object index by binary_integer;--索引表
   
  a1 t_table1 := t_table1();--初始化
  a2 t_table2;--无需初始化
 
  procedure printNestedTable(para1 t_table1) as
    v_index number;
  begin
    dbms_output.put_line('[printNestedTable]');
    v_index := para1.first;--如果是空数组v_index会被赋null
   
    while v_index <= para1.last loop
     
      dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
     
      v_index:=para1.next(v_index);--如果到了结尾v_index会被赋null
   
    end loop;
    dbms_output.put_line('  ');
   
  end printNestedTable;
 
  --嵌套表的下标是从1的固定连续值
  --所以可以用for循环来遍历
  procedure printNestedTable2(para1 t_table1) as
    v_index number;
  begin
    dbms_output.put_line('[printNestedTable2]');
 
    for v_index in 1..para1.count loop
      dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
    end loop;
    dbms_output.put_line('  ');
   
  end printNestedTable2;
 
  --索引表的下标可以是负数,且无需连续,但元素的存储是紧凑的.
  procedure printIndexedTable(para1 t_table2) as
    v_index number;
  begin
    dbms_output.put_line('[printIndexedTable]');
    v_index := para1.first;--如果是空数组v_index会被赋null
   
    while v_index <= para1.last loop
     
      dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
     
      v_index:=para1.next(v_index);--如果到了结尾v_index会被赋null
   
    end loop;
    dbms_output.put_line('  ');
   
  end printIndexedTable;

begin

  dbms_output.put_line('a1.extend(3)之前:');
  dbms_output.put_line('fisrt='||a1.first||' last='||a1.last);
  printNestedTable(a1);
  printNestedTable2(a1);
  dbms_output.put_line('==============');
 
  a1.extend(3);
  dbms_output.put_line('a1.extend(3)之后:');
  dbms_output.put_line('fisrt='||a1.first||' last='||a1.last);
  dbms_output.put_line('==============');
 
  a1(1):=t_object('aaa',11);
  a1(3):=t_object('ccc',33);
  --a1(5):=t_object('eee',55);会报下标出界错误
  dbms_output.put_line('a1(1),a1(3)赋值之后:');
  printNestedTable(a1);
  printNestedTable2(a1);
  dbms_output.put_line('==============');
 
  dbms_output.put_line('a2赋值之前:');
  dbms_output.put_line('fisrt='||a2.first||' last='||a2.last);
  dbms_output.put_line('==============');

  a2(11000):= t_object('aaa',11);--无需通过extend来分配空间
  a2(-3):= t_object('bbb',22);
  dbms_output.put_line('a2赋值后:');
  dbms_output.put_line('fisrt='||a2.first||' last='||a2.last);
  printIndexedTable(a2);
end;

二.执行结果

 

a1.extend(3)之前:
fisrt= last=
[printNestedTable]
[printNestedTable2]
==============
a1.extend(3)之后:
fisrt=1 last=3
==============
a1(1),a1(3)赋值之后:
[printNestedTable]
1:aaa,11
2:,
3:ccc,33
[printNestedTable2]
1:aaa,11
2:,
3:ccc,33
==============
a2赋值之前:
fisrt= last=
==============
a2赋值后:
fisrt=-3 last=11000
[printIndexedTable]
-3:bbb,22
11000:aaa,11

PL/SQL 过程已成功完成。

三.结论

1.索引表无需初始化,也不用extend来扩展空间
2.索引表的键值可以是负值,且不必连续
3.嵌套表的键值是连续和固定的,从 1开始.例如extend(3)产生的键值是1,2,3;数组下标也只能是1,2,3
4.first是最小值下标值,last是最大下标值,与索引表的元素赋值顺序无关
分享到:
评论

相关推荐

    嵌套表集合-索引表集合

    **--索引表集合** ``` declare type 集合类型名 is table of 元素类型 index by 下标类型; 变量名集合类型名 begin 集合类型名(唯一下标):=元素; end; --嵌套表集合 declare type 嵌套类型名 is table ...

    C#两级嵌套hash表

    封装hashtable的两级hash表,两个键值索引和访问。适合存放稀疏数据,如稀疏矩阵,稀疏表等结构,由于提供key-value的索引遍历,数据稀疏的情况下,相比于传统矩阵遍历的速度更快。

    oracle 10 学习资料.pptx

    嵌套表与索引检索表的主要区别在于,嵌套表可以直接存储在数据库中,可以使用SQL进行操作,而索引检索表通常存储在PL/SQL变量中。 可变数组是类似于C语言中的动态数组,可以动态地改变其大小。在Oracle 10g中,嵌套...

    PLSQL高级编程资料

    与索引表不同的是,嵌套表的索引是自动分配的,且是连续的。 **1.2.1 初始化嵌套表** 初始化嵌套表非常简单,可以直接通过构造函数或使用`EXTEND`关键字来实现。 **示例代码:** ```plsql DECLARE TYPE emp_...

    list嵌套list例子

    访问嵌套列表中的元素与访问普通列表类似,只是需要额外的索引层级。比如要获取子列表的第一个元素,可以这样写: ```python element = nested_list[3][0] # 返回4 ``` 3. 遍历嵌套列表: 遍历嵌套列表时,可以使用...

    SQL视图与索引总结

    - **非聚集索引**:非聚集索引具有与表的数据完全分离的结构,适合直接匹配单个条件的查询。 ##### 3. 创建索引 ```sql CREATE UNIQUE NONCLUSTERED [CLUSTERED] INDEX IX_UQ_NONCLUSTERED_BarCode ON GoodsInfo ...

    Oracle知识之集合和成员函数.pptx

    嵌套表与索引检索表(也称为关联数组)之间有相似之处,它们的结构相同,访问元素的方式类似。然而,嵌套表提供了更丰富的操作,如集合方法,使它们在某些场景下更加灵活。 最后,可变数组是另一种集合类型,允许...

    sql server2008创建模式、表、索引与视图

    各类查询操作(单表查询(1) 、连接查询(2) 、嵌套查询(2) 、集合查询(1) ) 视图操作 视图的创建(1)、删除 (1) 、查询(1) 、更新(1) 注意 (x) :x个SQL测试用例 实验内容的顺序 SQL Server 2008不能完全支持SQL99

    适合村状表结构的模式--《嵌套集合模型》

    ### 适合树状表结构的模式 -- 嵌套集合模型 #### 引言 在数据库设计中,处理分层数据是一项常见且重要的任务。传统的关系型数据库表并不直观地支持层级关系,这使得管理此类数据变得复杂。本文将探讨嵌套集合模型...

    mysql数据库设计为表连接设计索引

    - **连接谓词**:定义表与表之间连接关系的谓词,例如`WHERE cust.cno = invoice.cno`。 为了提高查询效率,通常会为本地谓词创建索引。这是因为本地谓词可以显著减少查询时需要处理的数据量,而连接谓词则主要用于...

    MONGODB的索引探究

    MongoDB的索引是数据库性能优化的关键因素,与MySQL、Oracle等关系型数据库中的索引原理相似,但具有自身的特性和限制。MongoDB的索引建立在Collection(表)级别,采用B-树数据结构来加速查询和排序操作。 1. 默认...

    函数索引使用

    - 函数索引不能用于LOB、REF和嵌套表等数据类型。 - 函数索引不支持某些复杂的表达式组合。 ##### 2. 权限问题 - 创建函数索引通常需要拥有`CREATE INDEX`权限。 - 若要使用全局重写功能,则可能还需要`CREATE ANY ...

    第四章ORACLE表管理.ppt

    嵌套表是指将一个表嵌套在另一个表中的表类型,用于存储复杂的关系数据。 4.8 其他表 除了上述表类型外,还有其他一些特殊的表类型,如外部表、临时表等。 掌握各种类型的表的创建方法,了解常规表、分区表、索引...

    PL-SQL集合与记录

    与索引表不同的是,嵌套表的索引是连续的,并且可以在数据库中存储。 - **无上界限制:** 嵌套表的大小可以动态增长,没有固定的上限。 - **可存储性:** 可以定义等效的SQL类型,将嵌套表保存到数据库中并通过SQL...

    pl/sql学习

    与嵌套表相比,VARRAY的大小固定且不可改变,但在某些情况下提供更好的性能。 **语法** VARRAY的定义语法如下: ```sql TYPE type_name IS VARRAY(max_size) OF element_type [NOT NULL]; ``` - `type_name`: ...

    Oracle中轻松取得建表和索引的DDL语句

    而另一种方法就是写复杂的脚本来查询数据字典,但这对于一稍微复杂的对象,如IOT和 嵌套表等,还是无法查到。从数据字典中获得DDL语句是经常要用的,特别是在系统升级/重建的时候。在 Oracle 9i中,我们可以直接通过...

    MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

    在MySQL数据库的学习中,多表查询是至关重要的一个环节,它涵盖了外键、表连接、子查询以及索引等多个核心概念。这些知识点是理解和优化数据库性能的基础,对于任何数据库管理员或者开发人员来说都是必备技能。 ...

    第四章 ORACLE表管理.pptx

    ORACLE 表的物理组织形式包括堆表、索引组织表、分区表、对象表、嵌套表等。 * 堆表(Normal Table):最基本的表类型,数据存储在堆中。 * 索引组织表(Index Organized Table):索引组织表是基于索引的表类型,...

Global site tag (gtag.js) - Google Analytics