PL/SQL三种集合类型的比较<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
       集合是指在一个程序变量中包含多个值。PL/SQL提供的集合类型如下:
Associative Array:
TYPE t IS TABLE OF something INDEX BY PLS_INTEGER;
Nested Table:
TYPE t IS TABLE OF something;
VARRAY:
TYPE t IS VARRAY (123) OF something;
三种集合的各自使用范围
       前提是在PL/SQL中希望某种类型的多个值,并且希望使用myarray[n]的形式访问。
范围:SQL or PL/SQL
       最大的区别是首先需要确定使用范围,SQL和PL/SQL时两种不同的语言。PL/SQL是SQL的过程性语言。Associative Arrays仅存在于PL/SQL中。因此:
       ·只能在PL/SQL中使用的是:Associative Array
       ·可以在SQL中使用:Nested Table, VARRAY
       同时需要注意的是:在SQL中创建一个类型和PL/SQL中声明一个类型是不同的。
SQL中创建的集合类型
       集合是SQL的一部分,不需要到PL/SQL中就可以使用它们:
       CREATE TYPE VARCHAR2_TT AS TABLE OF VARCHAR2(100)
/
SELECT column_value AS val
FROM   TABLE(VARCHAR2_TT('Apple','Banana','Apricot'))
WHERE  column_value NOT LIKE 'A%';
 
VAL
--------------------
Banana
在以上的例子中,我们创建了一个集合类型,并在查询中使用,完全在SQL中。这种形式创建的类型可以在任何查询和PL/SQL程序中使用。其他用户使用需要GRANT EXECUTE ON type_name TO other_account授权。
PL/SQL中声明的集合类型
       PL/SQL中,可以使用SQL中创建的集合类型,或者本地声明自己的类型。在PL/SQL中声明可以更加灵活的自定义包中专用的类型,允许声明他们使用%TYPE%ROWTYPE引用特定的表的列,如TABLE OF emp.empno%TYPE。不过这仅仅是PL/SQL中的特征,不能在SQL中使用,甚至可以定义自己的类型,然后生命那种类型的集合。如下:
DECLARE
    TYPE stats_rec IS RECORD
    ( batch_step      batch_log.step_name%TYPE
    , elapsed_time    INTERVAL DAY(0) TO SECOND(0)
    , rows_processed  PLS_INTEGER );
 
    TYPE stats_tt IS TABLE OF stats_rec; -- a locally-defined nested table collection type
由于仅在PL/SQL中使用, SQL并不知道:
CREATE OR REPLACE PACKAGE testtypes AS
    TYPE varchar2_tt IS TABLE OF VARCHAR2(100);
END testtypes;
/
 
Package created.
 
SELECT column_value AS val
FROM   TABLE(testtypes.VARCHAR2_TT('Apple','Banana','Apricot'))
WHERE  column_value NOT LIKE 'A%';
 
FROM   TABLE(testtypes.VARCHAR2_TT('Apple','Banana','Apricot'))
       *
ERROR at line 2:
ORA-22905: cannot access rows from a non-nested table item
可以使用以下查询查看所有类型:
SELECT ct.owner, ct.type_name, ct.elem_type_name, ct.length
FROM   all_coll_types ct
     , all_types ot
WHERE  ct.coll_type = 'TABLE'
AND    ot.type_name(+) = ct.elem_type_name
AND    ot.owner(+) = ct.elem_type_owner
AND    ot.type_name IS NULL
ORDER BY ct.owner, ct.type_name;
Associative Arrays特征
       如果在PL/SQL中只需要声明和填充,那么关联数组将是一种方便的方法。不需要独立的CREATE OR REPLACE TYPE,不需要初始化,不需要扩展,可以随意的放入各种值,如下:
DECLARE
    TYPE number_index_by_string IS TABLE OF NUMBER INDEX BY VARCHAR2(30);
    TYPE string_index_by_number IS TABLE OF dept.loc%TYPE INDEX BY PLS_INTEGER;
 
    v_country_codes  NUMBER_INDEX_BY_STRING;
    v_countries      STRING_INDEX_BY_NUMBER;
BEGIN
    v_country_codes('Ukraine') := 380;
    v_country_codes('UAE')     := 971;
    v_country_codes('UK')      := 44;
    v_country_codes('USA')     := 1;
 
    v_countries(380)  := 'Ukraine';
    v_countries(971)  := 'UAE';
    v_countries(44)   := 'UK';
    v_countries(1)    := 'USA';
END;
       需要注意的是,在number_index_by_string中使用了INDEX BY VARCHAR2(30),这使我们通过v_country_codes('UK')引用数组的UK元素。这是数组的唯一特征。关联数组没有构造体。也就是不能使用myarray := mytype(2,4,6,37)进行一次性填充四个值。
PL/SQL集合类型相对于SQL集合类型
       可以在PL/SQL中声明任何类型。
       主要区别如下:
范围
意义
集合类型
PL/SQL
只能在PL/SQL中声明,没有"CREATE OR REPLACE TYPE". SQL 中不能使用。
不需要初始化和扩展,只需要分配值给特定的元素,甚至不需要元素顺序。
可以选择"index by" - PLS_INTEGER, BINARY_INTEGER或 VARCHAR2.
没有构造体,必须显示分配值。不能在查询中作为一个表处理,如SELECT * FROM TABLE(myarray)
 
 
Associative Array
SQL ,PL/SQL
可以在PL/SQL中声明或者使用"CREATE OR REPLACE TYPE";
使用前必须初始化:myarray mytype := mytype();
具有构造体,可以使用mytype('x','y','z');分配值;
必须进行扩展以增加元素,myarray.EXTEND;
在查询中可以作为表处理SELECT * FROM TABLE(myarray) (如果使用CREATE TYPE创建).
 
 
Nested Table
VARRAY
VARRAYs的缺点
       可以看到,VARRAYsNested Tables的描述基本相同,并且两种类型都可以在SQLPL/SQLTABLE()中使用。VARRAYs的一些不具有的特征在nested table中可以使用的包括:
       ·集合函数,如CARDINALITY,COLLECT,POWERMULTISET,等;
       ·多重集条件,如IS A SET, MEMBER OF,SUBMULTISET
       ·多重集操作符,如MULTISET INTERSECT
       如:
DECLARE
    my_array VARCHAR2_TT :=
        VARCHAR2_TT('Apple','Apple','Orange','Banana');
BEGIN
    IF my_array IS A SET THEN
        DBMS_OUTPUT.PUT_LINE('No duplicates found');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Collection contains duplicates');
    END IF;
END;
 
Collection contains duplicates
再如:
DECLARE
    my_array VARCHAR2_TT :=
        VARCHAR2_TT('Apple','Apple','Orange','Banana');
BEGIN
    IF 'Orange' MEMBER OF my_array THEN
        DBMS_OUTPUT.PUT_LINE('"Orange" exists in the collection');
    ELSE
        DBMS_OUTPUT.PUT_LINE('"Orange" does not exist in the collection');
    END IF;
END;
 
"Orange" exists in the collection
 
 
DECLARE
    my_array1 VARCHAR2_TT :=
        VARCHAR2_TT('Apple','Orange','Cherry','Banana');
 
    my_array2 VARCHAR2_TT :=
        VARCHAR2_TT('Orange','Kumquat','Grape','Banana');
 
    my_array3 VARCHAR2_TT := my_array1 MULTISET INTERSECT my_array2;
BEGIN
    FOR i IN my_array3.FIRST..my_array3.LAST LOOP
        DBMS_OUTPUT.PUT_LINE(my_array3(i));
    END LOOP;
END;
 

 

转载于:https://blog.51cto.com/robertleepeak/197368

PL/SQL三种集合类型的比较相关推荐

  1. PL/SQL 记录与集合

    一.记录类型简介 不使用记录的PLSQL语句块 declare v_empno  NUMBER; v_ename  varchar2(20); v_job varchar2(9); v_mgr NUM ...

  2. 计算机三种不同类型的用户账户,网络操作系统——Windows Server 2008篇 教学课件 1 作者 刘本军 李建利 [项目5]用户与组的管理.ppt...

    网络操作系统--Windows Server 2008篇 教学课件 1 作者 刘本军 李建利 [项目5]用户与组的管理.ppt (76页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就 ...

  3. Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景

    Redis源码-String:Redis String命令.Redis String存储原理.Redis String三种编码类型.Redis字符串SDS源码解析.Redis String应用场景 R ...

  4. SEO三种职位类型:编辑型SEO、技术型SEO、营销型SEO详解

    SEO三种职位类型:编辑型SEO.技术型SEO.营销型SEO详解 网站SEO优化作为营销端的服务之一,这些年也呈现出日新月异的格局.一改过去游兵散将式的小作坊生产模式,不断有力量强大的公司团体加入到这 ...

  5. Redis中7种集合类型应用场景

    象我这样使用了关系型数据库很长时间的码农来说,对一些新的数据类型,比如:集合,链表,的使用场景,感到有种莫名的恐惧.不知有什么用. 在这里,我把几种REDIS数据类型的应用场景 文章转载如下: Red ...

  6. Typescript常见三种函数类型

    Typescript有常见三种函数类型: 分别是普通的函数: 有可选参数的函数: 有剩余参数的函数: 普通函数 function findMan(age:number):string{return ' ...

  7. Project中三种任务类型解释

    概述 Project--文件---选项---日程里,有"默认任务类型"设置 三种任务类型,与资源结合起来后,就需要根据实际情况选择了. 固定单位 这是Project默认的任务类型. ...

  8. python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)

    数据从不一样的角度能够用不一样的含义去解释它,如: 10,011,101 对上面这个数据,咱们有以下多种含义去解释它: 1)它是1个二进制数字,或者是1个十进制数字: 2)一段文本: 3)用 , 号分 ...

  9. 交换机以太网端口三种链路类型

    以太网端口的三种链路类型:Access.Hybrid和Trunk Access类型的端口只能属于1个VLAN,一般用于连接计算机的端口: Trunk类型的端口可以允许多个VLAN通过,可以接收和发送多 ...

最新文章

  1. 深度人脸识别:CVPR2020论文要点
  2. error: failed linking file resources
  3. 必要商城高级UED经理张不写:设计师如何规划职业方向
  4. Linux内核调试技术——kprobe使用与实现
  5. 第六章:系统困境之 你的努力与时代进程相逆
  6. tarfile读文件python_Python中使用tarfile压缩、解压tar归档文件示例
  7. axios 同时多个请求_Axios是什么?用在什么场景?如何使用?
  8. TensorFlow Keras 官方文档中文版文档学习
  9. git官网下载太慢解决方法
  10. lwj_C#_work 字符串、类的使用和数学运算
  11. Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named prepa
  12. 十六进制编辑器HxD Hex Editor x64 v2.3.0.0
  13. 今年是嵌入式香还是互联网香?
  14. 多可文档管理系统的手机版
  15. PostgreSQL数据库导入EXCEL数据表
  16. 输出n行数字三角形(已修改)
  17. 百度文库推广怎么做-百度文库推广技巧
  18. javaweb黑马旅游网站
  19. day16多线程网络编程日志枚举
  20. Python运行 import cv2 等报错 Illegal instruction (core dumped) 解决办法

热门文章

  1. PyTorch中nn.Module类简介
  2. 经典网络GoogLeNet介绍
  3. 代码覆盖测试工具Kcov简介及使用
  4. 【EMC】EMC屏蔽设计
  5. 丰田chr优惠5万_别克昂科威优惠5万?是否该考虑入手了呢?
  6. mybatis mysql 配置文件_Mybatis配置文件详解(4)
  7. MySql库中所有表的属性_SQL查询某库所有的表所有的字段及字段的属性
  8. python loop call soon_从“call\u soon”回调函数执行协同路由
  9. vba 编辑combobox内容_初识Visual Basic编辑器并建立一段简单的代码
  10. 争吵所达到的效果要_悟空:不要害怕争吵,有时候争吵一些不喜欢的事情也能创造和谐...