集合类型

1. 使用条件:

a. 单行单列的数据,使用标量变量 。 
   b. 单行多列数据,使用记录 [ 详细讲解请见: 点击打开链接 ]
   c. 单列多行数据,使用集合

*集合:类似于编程语言中数组也就是。pl/sql集合类型包括关联数组Associative array(索引表 pl/sql table)、嵌套表(Nested Table)、变长数组(VARRAY)。

2. 三种集合类型区别:

Nested table与VARRY既可以被用于PL/SQL,也可以被直接用于数据库中,但是Associative array不行,也就是说,Associative array是不能通过CREATE TYPE语句进行单独创建,只能在PL/SQL块(或Package)中进行定义并使用(即适用范围是PL/SQL Block级别),而Nested table与VARRAY则可以使用CREATE TYPE进行创建(即适用范围是Schema级别),它们还可以直接作为数据库表中列的类型。

3.  集合的方法:

exists(index) 索引处的元素是否存在  
       count 当前集合中的元素总个数  
       limit 集合元素索引的最大值  
          索引表和嵌套表是不限个数的,所以返回null,变长数组返回定义时的最大索引  
       first  返回集合第一个元素索引  
       last  返回集合最后一个元素索引  
       prior 当前元素的前一个  
       next 当前元素的后一个  
      
       extend 扩展集合的容量,增加元素 只是用于嵌套表和varry类型  
           x.extend 增加一个null元素  
           x.extend(n) 增加n个null元素  
           x.extend(n,i) 增加n个元素,元素值与第i个元素相同  
       trim 从集合的尾部删除元素 只用于NEST TABLE和VARRY类型  
       trim 从集合尾部删除一个元素  
       trim(n) 从集合尾部删除n个元素  
       delete 按索引删除集合元素  
           delete 删除所有  
           delete(index) 删除第index个  
           delete(a,b) 删除a--b之间的所有元素

4.  集合类型的声明与初始化:

    1)关联数组:
         a. 下标无限制,可以为负数  
         b. 元素个数无限制  
         c.  定义  
              TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;  
              type_name:用户自定义数据类型的名字  
              element_type:索引表中元素类型  
              key_type:索引表元素下标的数据类型(BINARY_INTEGER,PLS_INTEGER,VARCHAR2)

d. 例1:

  1. declare
  2. type index_tab_type is table of varchar2(30) index by BINARY_INTEGER;
  3. v_table index_tab_type;
  4. begin
  5. v_table(-1) :='hello';--设定下标为-1的元素的值
  6. v_table(1)  :=',';
  7. dbms_output.put_line(v_table(-1)||'-'||v_table(1));
  8. dbms_output.put_line('元素个数:'||v_table.count);
  9. v_table(5) :='world';
  10. dbms_output.put_line('元素个数:'||v_table.count);
  11. dbms_output.put_line('第一个元素'||v_table.first);
  12. dbms_output.put_line('最后一个元素'||v_table.last);
  13. end;
  14. /
  1. hello-,
  2. 元素个数:2
  3. 元素个数:3
  4. 第一个元素-1
  5. 最后一个元素5
  6. PL/SQL 过程已成功完成。

e.例2:使用varchar2作为索引元素类型 ,其实也就和java中的map一样了 key-value(键值对)形式存储

  1. declare
  2. type index_tab_type is table of varchar2(30) index by varchar2(30);
  3. v_table index_tab_type;
  4. v_record emp%rowtype;
  5. begin
  6. --emp表中查询3条记录,以name-job的形式存储到索引表中
  7. select * into v_record from emp where emp.empno=7788;
  8. v_table(v_record.ename):= v_record.job;
  9. select * into v_record from emp where emp.empno=7844;
  10. v_table(v_record.ename):= v_record.job;
  11. select * into v_record from emp where emp.empno=7900;
  12. v_table(v_record.ename):= v_record.job;
  13. dbms_output.put_line(v_table.count);--3
  14. dbms_output.put_line(v_table(v_record.ename));--CLERK
  15. end;
  16. /
  1. 3
  2. CLERK
  3. PL/SQL 过程已成功完成。

2)嵌套表 Nested Table
         a. 下标从1开始,元素个数灭有限制(*使用时必须先初始化,用extend属性可以扩展元素个数)  
         b.  可以作为表定义数据类型,但是前提是要先create 创造嵌套表类型,这就可以实现1对多了定义  
                TYPE type_name IS TABLE OF element_type;  
         c.  和索引表的区别也就是看看有无index by语句,嵌套表的索引固定是int型的 .

d.例1:

  1. declare
  2. type nest_table_type is table of emp.ename%type;
  3. v_nest_tab nest_table_type;
  4. begin
  5. v_nest_tab :=nest_table_type('x');--初始化 必须! 语句 type_name(...)
  6. select ename into v_nest_tab(1) from emp where empno=7788;
  7. dbms_output.put_line(v_nest_tab(1));
  8. end;
  1. SCOTT
  2. PL/SQL 过程已成功完成。

e.例2:在表列中使用嵌套表 嵌套表类型的列是单独一个表存储,先创建一个这样的类型才能使用

  1. create type nest_tab_type is table of varchar2(30);
  2. create table test_nest_tab(
  3. id int,
  4. vals nest_tab_type --使用
  5. ) nested table vals store as nest_tab;--vals字段用嵌套表存储,表明nest_tab
  6. --上面语句执行完之后,在生成TEST_NEST_TAB的同时会生出一个关联表NEST_TAB用来存储关联表的数据
  7. --插入数据
  8. insert into test_nest_tab values(1,nest_tab_type('one','two','three','four'));
  9. --查询数据
  10. declare
  11. v_id int;
  12. v_tab nest_tab_type;
  13. begin
  14. select * into v_id,v_tab from test_nest_tab where id=1;
  15. dbms_output.put_line(v_id);
  16. for i in 1..v_tab.count loop
  17. dbms_output.put_line(v_tab(i));
  18. end loop;
  19. end;
  1. 1
  2. one
  3. two
  4. three
  5. four
  6. PL/SQL 过程已成功完成。

3)Varry 可变数组

a. 定义  
             TYPE type_name IS VARRAY(size_limit) OF element_type[NOT NULL];  
        b.  这个就和java中的数组差不多了,下标from 1 ,定义时先指定最大元素个数,也和varchar2(size)这种一样。  
        c.  使用时也必须先用构造方法初始化 ,可以作为表列类型  
        d.  例1:

  1. declare
  2. type varr is VARRAY(10) of int;
  3. v_varr varr :=varr();
  4. begin
  5. --dbms_output.put_line(varr.count);
  6. for i in 1..5 loop
  7. v_varr.extend;
  8. v_varr(i) :=i*i;
  9. end loop;
  10. for i in 1..5 loop
  11. dbms_output.put_line(v_varr(i));
  12. end loop;
  13. end;
  14. /
  1. 1
  2. 4
  3. 9
  4. 16
  5. 25
  6. PL/SQL 过程已成功完成。

e.例2:可变数组作为表列类型 可变数组是存储在表内部的,不同于嵌套表

  1. create type varr_type is varray(10) of varchar2(30);--先创建类型
  2. create table test_varray(
  3. id int,
  4. name varchar2(30),
  5. params varr_type --param是使用可变数组类型
  6. );
  7. --插入数据
  8. insert into test_varray values(1,'bird',varr_type('a','b','c'));
  9. --查询数据
  10. declare
  11. v_varr varr_type;
  12. v_name test_varray.name%type;
  13. begin
  14. select name,params into v_name,v_varr from test_varray where id=1;
  15. for i in 1..v_varr.count loop
  16. dbms_output.put_line(v_varr(i));
  17. end loop;
  18. end;
  1. a
  2. b
  3. c
  4. PL/SQL 过程已成功完成。

5. 如何选择适用的集合类型:

通常来说,对集合类型的第一选择应该是Associative array,因为它不需要初始化或者EXTEND操作,并且是迄今为止最高效的集合类型。唯一不足的一点是它只能用于PL/SQL而不能直接用于数据库。

  如果你需要允许使用负数索引,应该选择Associative array;

  如果你需要使用10g,11g中的那些集合操作,应该选择Nested table;

  如果你需要限制集合元素的个数,应该选择VARRAY。

Oracle 集合类型的更多相关文章

  1. Oracle集合类型

    Oracle集合类型介绍   集合类型   1. 使用条件:    a. 单行单列的数据,使用标量变量 .     b. 单行多列数据,使用记录    c. 单列多行数据,使用集合        *集 ...

  2. oracle 集合变量以及自定义异常的用法

    oracle 集合变量以及自定义异常的用法, 在过程 record_practice 有record变量和自定义异常的用法实例.具体在3284行. CREATE OR REPLACE Package ...

  3. oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误

    oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...

  4. 【Oracle-PLsql】使用存储过程,利用table集合类型开发复杂业务报表

    在一般的项目中,都需要开发一些报表,少则几个字段,多则几十个字段,需要关联的表可能多达十几.几十张表,如果想要使用一个SQL语句将这几十张表关联起来 查询所需要的字段,当你听到这里的时候,你的脑子可能 ...

  5. Scala集合类型详解

    Scala集合 Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变的和不可变的集合. 可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合 ...

  6. Spring学习日记03_IOC_属性注入_集合类型属性

    Ioc操作Bean管理(xml注入集合属性) 注入数组类型属性 注入List集合类型属性 注入Map集合类型属性 Stu类 public class Stu { //1. 数组类型属性 private ...

  7. JAVA集合类型详解

    一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...

  8. C#集合类型大盘点

    C#集体类型( Collections in C#) 集合是.NET FCL(Framework Class Library)中很重要的一部分,也是我们开发当中最常用到的功能之一,几乎是无处不在.俗话 ...

  9. Python学习笔记——集合类型

    集合类型有两种不同的类型——可变集合(set)和不可变集合(frozenset) 可变集合不是可哈希的,不能用作字典的键,也不能用做其他集合中的元素 不可变集合是有哈希值的,能被用做字典的键或者是作为 ...

随机推荐

  1. (在模仿中精进数据可视化03)OD数据的特殊可视化方式

    本文完整代码已上传至我的Github仓库https://github.com/CNFeffery/FefferyViz 1 简介 OD数据是交通.城市规划以及GIS等领域常见的一类数据,特点是每一条数 ...

  2. spring boot:使mybatis访问多个druid数据源(spring boot 2.3.2)

    一,为什么要使用多个数据源? 1,什么情况下需要使用多个数据源? 当我们需要访问不同的数据库时,则需要配置配置多个数据源, 例如:电商的业务数据库(包括用户/商品/订单等)            和统 ...

  3. spring boot:在项目中引入第三方外部jar包集成为本地jar包(spring boot 2.3.2)

    一,为什么要集成外部jar包? 不是所有的第三方库都会上传到mvnrepository, 这时我们如果想集成它的第三方库,则需要直接在项目中集成它们的jar包, 在操作上还是很简单的, 这里用luos ...

  4. Android adb实现原理

    adb定义: adb(Android Debug Bridge) 安卓调试桥,包含adb client.adb server和adbd三部分. adb client:运行在PC上,即DDMS或者在Wi ...

  5. 查看centos 7.6 当前所有监听端口

    由于要开展服务器安全工作查看系统当前所监听端口 ss -lnt 缺点发现有重复端口也显示出来了! ss -lnt | awk '/*

  6. Python之dict字典详解

    Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,字典是另 一种可变容器模型,且可存储任意类型对象.具有极快的查找速度. 字典是一种通过名字或者关键字 ...

  7. IDEA2020.2版本无法开启KDE全局菜单的解决方案

    IDEA2020.2版本无法开启KDE全局菜单的解决方案 前言 :更新了2020.2之后全局菜单一直不生效,一直找不到解决的办法,就退回了2020.1,今天又试了一次,成功解决全局菜单显示问题. 之前 ...

  8. I-Isolated Pointset

    题意:给定T组数据,每组数据有一个数n,表示点集的个数,问是否存在一个点数为n的点集,使得任意两个点组成的边的垂直平分线过点集中的第三个点 本题非常巧妙,只需构造一个由(n-2)个相同共点(圆心)等边 ...

  9. CorelDRAW x4 提示非法软件产品被禁用解决方法教程

    偶尔翻开移动硬盘,找到这货,CorelDraw X4简体中文正式版.网上现在比较难下载得到了,X4是我最常用的一个.现在把它分享出来,有需要的可以去下载使用. CDR全名CorelDRAW ,是加拿大 ...

  10. [阿里DIN] 从论文源码学习 之 embedding层如何自动更新

    [阿里DIN] 从论文源码学习 之 embedding层如何自动更新 目录 [阿里DIN] 从论文源码学习 之 embedding层如何自动更新 0x00 摘要 0x01 DIN源码 1.1 问题 1 ...