zoukankan      html  css  js  c++  java
  • Oracle PL/SQL 程序设计读书笔记 第12章 集合

    Oracle PL/SQL 程序设计读书笔记 - 第12章 集合

    Oracle PL/SQL 程序设计读书笔记 - 第12章 集合

    12.1 集合概述

    12.1.1 集合概念和术语

    • 集合类型:共有3种能用的集合类型:关联数组,嵌套表和VARRAY。

    12.1.2 集合类型

    • 关联数组:是一个只能在PL/SQL环境使用的,一维的,没有边界的,稀疏的,由同质元素构成的集合类型。(PL/SQL表,索引表)
    • 嵌套表:是一维的,没有边界的,由同质元素组成的集合类型。是多重集合的,这同时意味着嵌套表中的元素没有固定的顺序。
    • VARRAY:可变长的数组,和其他两种集合类型相似,也是一维的,由同质元素组成的集合类型。不过这种结合类型总是有边界并且是非稀疏的。可以用于PL/SQL和数据库。它的元素是有顺序的。

    12.1.4 使用集合的场合

    • 当我要在参数列表中使用这些集合类型时,我必须用带有包名的规范化形式。
    • 如果使用的是嵌套表或者VARRAY类型,就可以在表的列中存取非原子数据。
    • VARRAY作为列的数据类型可以实现和嵌套表相同的效果,不过VARRAYnteds提前声明最大尺寸,并且这种类型实际上是和表的剩余数据一起在“行内”保存的。也就是说VARRAY是针对小数组,而嵌套表列适合大数组。

    12.1.5 选择一个集合类型

    Oacle集合类型的对比(表12-2略)

    12.2 集合方法(内置)

    12.2.1 COUNT方法

    COUNT用于计算一个关联数组,嵌套表或者VARRAY中定义的元素数量,如果元素已经通过DELETE或者TRIM操作从集合中移除了,COUNT计数不会包含这些元素。

    如果把COUNT应用于一个已经初始化的,但还没有任何元素的集合,方法返回的是0。如果用于一个空的关联数组也是返回0

    如果把COUNT用于一个未经初始化的嵌套表或者VARRAY,就会抛出异常。

    12.2.2 DELETE方法

    DELETE方法用于从一个关联数组、嵌套表或者VARRAY中删除一个,一批或者全部元素。DELETE(i,j)删除以i开始以j结束的闭区间内的所有元素。

    如果i和j指向的是根本就不存在的元素,DELETE方法会尝试正确处理,而不抛出异常。

    12.2.3 EXISTS方法

    对嵌套表,关联数组,VARRAY使用EXISTS方法可以确定集合中是否包含指定的行。

    如果把EXISTS方法用于一个未经初始化嵌套表或者VARRAY,或者一个已经初始化但还没有任何元素的集合,它只是简单的返回FALSE。而不会抛出异常。

    12.2.4 EXTEND方法

    向一个嵌套表或者VARRAYk添加一个元素需要单独的一个分配步骤。

    EXTEND(n,i)追加了n个元素然后把每个元素都设置成和第i个元素相同的值。

    如果对一个还没有被初始化的嵌套表或者VARRAY使用EXTEND方法,会抛出异常。

    12.2.5 FIRST和LAST方法

    对嵌套表,关联数组,VARRAY使用FIRST和LAST方法,会分别返回集合定义的最低和最高索引值。

    对于一个已经初始化的但还没有任何元素的集合使用FIRST和LAST方法,返回的结果是NULL。对于VARRAY而言FIRST返回的永远是1,LAST返回的结果和COUNT相同。

    12.2.6 LIMIT方法

    使用LIMIT方法可以确定一个VARRAY中可以定义的元素的最大数量。如果把这个方法用于一个已经初始化的嵌套表或者关联数组,返回的结果是NULL。

    12.2.7 PRIOR和NEXT方法

    对嵌套表,关联数组,VARRAY使用PRIOR和NEXT方法可以遍历集合的内容。

    PRIOR方法返回相对于i的前一个可用索引,NEXT返回的是下一个索引值。

    12.2.8 TRIM方法

    用TRIM方法可以从嵌套表或者VARRAY的尾端删除n个元素。如果不带参数,TRIM就只会删除一个元素。

    12.3 使用集合

    12.3.1 声明集合类型

    • 你可以通过TYPE语句在一个PL/SQL程序中声明集合类型。那么这个集合类型对于这个TYPE语句所在的代码块内部是可用的。如果是在包的规范部分定义的TYPE,则那些对这个包有EXECUTE权限的模式下的任何程序都可以使用这个类型。
    • 你也可以使用CREATE TYPE命令在数据库中定义一个嵌套表或者VARRAY类型,这时这个类型就是一个模式级别的对象。这种类型就可以用作数据库表的列的数据类型,可以用作对象类型的属性,也可以用于声明PL/SQL变量。任何对这个类型有EXECUTE权限的模式都可以引用这个类型。

    声明关联数组集合类型

    TYPE table_type_name IS TABLE OF datatype [ NOT NULL ] INDEX BY index_type;

    12.3.2 集合变量的声明和初始化

    collection_name collection_type {:= collection_type (...)};

    12.3.3 用数据填充集合

    刚刚初始化后的集合是空的。里面一个元素也没有。

    • 使用赋值操作符。赋值操作的行为包括创建元素,然后在该索引处保存值。
    • 集合赋值。实际上就是把一个集合拷贝到另一个集合。
    • 用关系表中的行赋值

    12.3.6 复杂数据类型的集合

    • 使用了表的%ROWTYPE属性的记录的集合

    我们通过在集合定义的语句的TABLE OF子句中指定一个记录类型来定义一个记录集合。这种方法只适用于在PL/SQL中声明的集合类型。而在数据库里定义的嵌套表和VARRAY类型就不能使用这种方法了。

    • 用户定义记录类型的集合
    • 对象类型和其他复杂类型的集合
    • 集合的集合(直接和间接)

    12.3.8 在SQL中使用集合

    • CAST:把一个集合类型映射到另一种集合类型。包括把一个VARRAY映射成一个嵌套表。
    • MULTISET:把一个数据库的表映射成集合。利用MULTISET和CAST,你可以像处理集合类型的列一样操作数据库表。
    • TABLE:把一个集合映射成数据库表。正好和MULTISET相反:它返回的映射表只有一列。

    12.4 嵌套表的多重集合操作

    • = 比较两个嵌套表是否相同(命名类型,基数以及元素值)
    • !=或<> 比较两个嵌套表是否不相同(命名类型,基数以及元素值)
    • [NOT]IN() 根据IN左边的嵌套表是否在圆括号中的嵌套表列表中,则返回TRUE
    • X MULTISET EXCEPT [DISTINCT] Y 返回一个集合,其元素属于X,但不属于Y
    • X MULTISET INTERSET [DISTINCT] Y 返回一个交集
    • X MULTISET EXCEPT [DISTINCT] Y 返回一个合集
    • SET(X) 返回嵌套表X中的元素去重后的结果
    • x IS [NOT] A SET 根据嵌套表是否是唯一元素组成返回TRUE
    • x IS [NOT] EMPTY 根据嵌套表是否为空返回TRUE
    • e [NOT] MEMBER [OF] x 根据表达式e是否是嵌套表x的一个成员返回TRUE
    • y [NOT] SUBMULTISET [OF] x 根据嵌套表y的元素是否是嵌套表x的元素的子集而返回TRUE
  • 相关阅读:
    Golang的math包常用方法
    部署tomcat部署实战案例
    CentOS 7.6操作系统部署JDK实战案例
    Linux防火墙iptables命令管理入门
    Docker镜像-基于DockerFile制作编译版nginx镜像
    使用Docker快速部署Mysql服务器
    Docker镜像-基于DockerFile制作yum版nginx镜像
    Docker镜像-手动制作yum版nginx镜像
    Docker容器操作基础命令
    Docker镜像管理篇
  • 原文地址:https://www.cnblogs.com/tjpanda88/p/2278605.html
Copyright © 2011-2022 走看看