`
szh8715
  • 浏览: 10448 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • 一场雨: 怎么处理汉化的事情?我在里面写汉字 都不行啊
    booklet

PL/SQL集合与记录

 
阅读更多

一 PL/SQL集合类型

PL/SQL提供了以下几种集合类型:

  1. 索引表,也称为关联数组,可以让我们使用数字或字符串作下标来查找元素。(这有点和其他语言中的哈希表相类似。)

索引表(关联数组)就是键值对的集合,其中键是唯一的,用于确定数组中对应的值。键可以是整数或字符串。第一次使用键来指派一个对应的值就是添加元素,而后续这样的操作就是更新元素。

对于关联数组,可以使用下面的语法进行定义

TYPE type_name IS TABLE OF element_type [NOT NULL]
INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2(size_limit)];
INDEX BY key_type;

key_type可以是BINARY_INTEGER或PLS_INTEGER,也可以是VARCHAR2或是它的子类型VARCHAR、 STRING或LONG。在用VARCHAR2做键的时候,我们必须指定VARCHAR2的长度,但这里不包括LONG类型,因为LONG等价于 VARCHAR2(32760)。而RAW、LONG RAW、ROWID、CHAR和CHARACTER都是不允许作为关联数组的键的。在引用一个使用VARCHAR2类型作为键的关联数组中的元素时,我们还可以使用其他类型,如DATE或TIMESTAMP,因为它们自动地会被TO_CHAR函数转换成VARCHAR2。索引表可以使用不连续的键作下标索引。如下例中,索引表的下标是7468而不是1:

DECLARE
  TYPE emptabtyp IS TABLE OF emp%ROWTYPE
    INDEX BY BINARY_INTEGER;

  emp_tab   emptabtyp;
BEGIN
  /* Retrieve employee record. */
  SELECT *
    INTO emp_tab(7468)
    FROM emp
   WHERE empno = 7468;
END; 
 

 

下面的例子演示了如何使用关联数组:

DECLARE
  TYPE population_type IS TABLE OF NUMBER
    INDEX BY VARCHAR2(64);

  country_population     population_type;
  continent_population   population_type;
  howmany                NUMBER;
  which                  VARCHAR2(64);
BEGIN
  country_population('Greenland')       := 100000;
  country_population('Iceland')         := 750000;
  howmany                               := country_population('Greenland');
  continent_population('Australia')     := 30000000;
  continent_population('Antarctica')    := 1000;   -- Creates new entry
  continent_population('Antarctica')    := 1001;   -- Replaces previous value
  which                                 := continent_population.FIRST;
  -- Returns 'Antarctica'
  -- as that comes first alphabetically.
  which                                 := continent_population.LAST;
  -- Returns 'Australia'
  howmany                               :=
                              continent_population(continent_population.LAST);
  -- Returns the value corresponding to the last key, in this
  -- case the population of Australia.
END;
/ 

  使用VARCHAR2类型作主键的关联数组的影响 

 

如果在使用VARCHAR2作为键的关联数组的会话中改变国家语言或全球化设置,就有可能引起一个运行时异常。例如,在一个会话中改变初始化参数 NLS_COMP或NLS_SORT的值后,再调用NEXT和PRIOR就可能会引起异常。如果我们必须在会话中更改这些设置的话,那么,在重新使用关联数组的相关操作之前,就必须确保参数值被改回原值。

在用字符串作为关联数组的键的时候,声明时必须使用VARCHAR2、STRING或LONG类型,但使用的时候可以使用其他类型,如NVARCHAR2,VARCHAR2等,甚至是DATE,这些类型值都会被TO_CHAR函数转成VARCHAR2。

但是,在使用其他类型作为键的时候一定要慎重。这里举几个例子:当初始化参数NLS_DATE_FORMAT发生改变时,函数SYSDATE转成字符串的值就可能发生改变,这样的话,array_element(SYSDATE)的结果就和先前的结果不一样了;两个不同的NVARCHAR2类型值转成VARCHAR2值之后可能得出的结果是相同的,这样,数组array_element(national_string1)和 array_element(national_string2)可能引用同一个元素。

当我们使用数据库连接(database link)把关联数组作为参数传递给远程数据库时,如果两个数据库的全球化设置不一致,远程数据库会使用自己的字符顺序来调用FIRST和NEXT操作,即使该顺序与原集合顺序不同。由于字符集的不同,就可能出现在一个数据库中两个不同的键在另一个数据库被当作同一个键处理的情况,这时程序就会收到一个 VALUE_ERROR异常。

 

 

       2 . 嵌套表可以容纳任意个数的元素,使用有序数字作下标。我们可以定义等价的SQL类型,把嵌套表存到数据库中去,并通过SQL语句进行操作。

在数据库中,嵌套表可以被当作单列的数据表来使用。Oracle在往嵌套表中存放数据时是没有特定顺序的。但是,当我们把检索出来的数据存放在PL/SQL变量时,所有行的下标就会从1开始顺序编号。这样,就能像访问数组那样访问每一行数据。

嵌套表有两个重要的地方不同于数组:

  • 数组有固定的上限,而嵌套表是没有上界的。所以,嵌套表的大小是可以动态增长的。如下图

  • 数组必须是密集的(dense),有着连续的下标索引。所以我们不能从数组中删除元素。而对于嵌套表来说,初始化时,它是密集的,但它是允许有间隙的 (sparse),也就是说它的下标索引可以是不连续的。所以我们可以使用内置过程DELETE从嵌套表中删除元素。这样做会在下标索引上留下空白,但内置函数NEXT仍能让我们遍历连续地访问所有下标。

对于嵌套表,可以使用下面的语法来进行定义:

TYPE type_name IS TABLE OF element_type [NOT NULL];
 

其中type_name是在集合声明使用的类型标识符,而element_type可以是除了REF CURSOR类型之外的任何PL/SQL类型。对于使用SQL声明的全局嵌套表来说,它的元素类型受到一些额外的限制。以下几种类型是不可以使用的:

  1. BINARY_INTEGER, PLS_INTEGER
  2. BOOLEAN
  3. LONG, LONG RAW
  4. NATURAL, NATURALN
  5. POSITIVE, POSITIVEN
  6. REF CURSOR
  7. SIGNTYPE
  8. STRING

 

     3. 变长数组能保存固定数量的元素(但可以在运行时改变它的大小),使用有序数字作为下标。同嵌套表一样,也可以保存到数据库中去,但灵活性不如嵌套表好。

VARRAY被称为变长数组。它允许我们使用一个独立的标识来确定整个集合。这种关联能让我们把集合作为一个整体来操作,并很容易地引用其中每一个元素。下面是一个变长数组的例子,如果我们要引用第三个元素的话,就可以使用Grade(3)。

对于变长数组类型,可以使用下面的语法进行定义:

TYPE  type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF
element_type [NOT NULL];

 type_name和element_type的含义与嵌套表相同。size_limit是正整数,代表数组中最多允许存放元素的个数。在定义VARRAY时,我们必须指定它的长度最大值。

 

二  集合的选择与使用

如果我们有用其他语言编写的代码或业务逻辑,通常可以把其中的数组或集合直接转成PL/SQL的集合类型。

  • 其他语言中的数组可以转成PL/SQL中的VARRAY。
  • 其他语言中的集合和包(bags)可以转成PL/SQL中的嵌套表。
  • 哈希表和其他无序查找表(unordered lookup table)可以转成PL/SQL中的关联数组。

嵌套表和关联数组的选择

 

嵌套表和关联数组(原来称为索引表)都使用相似的下标标志,但它们在持久化和参数传递上有些不同的特性。

嵌套表可以保存到数据表字段中,而关联数组不可以。嵌套表适于存放能够被持久化的重要数据。

关联数组适用于存放较小量的数据,每次调用过程或包初始化时在内存中构建出来。它能够保存容量不固定的信息,因为它的长度大小是可变的。关联数组的索引值很灵活,可以是负数,不连续的数字,适当的时候还可以使用字符串代替数字。

PL/SQL能自动地将使用数字作为键的关联数组和主数组(host array)进行转换。集合和数据库服务器间数据传输的最有效的方法就是使用匿名PL/SQL块进行批量绑定数据绑定。

 

嵌套表与变长数组间的选择

 

在数据个数能够预先确定的情况下,使用变长数组是一个很好的选择。在存入数据库的时候,变长数组会保持它们原有的顺序和下标。

无论在表内(变长数组大小不到4k)还是在表外(变长数组大小超过4k),每个变长数组都被作为独立的一个对象对待。我们必须对变长数组中的所有元素进行一次性检索或更新。但对于较大量的数据来说,变长数组就不太适用了。

嵌套表是可以有间隙的:我们可以任意地删除元素,不必非得从末端开始。嵌套表数据是存放在系统生成的数据表中,这就使嵌套表适合查询和更新集合中的部分元素。我们不能依赖于元素在嵌套表中的顺序和下标,因为这些顺序和下标在嵌套表存到数据库时并不能被保持。

 

 

 

 

分享到:
评论

相关推荐

    pl/sql最新中文手册

    6. **复合类型**:PL/SQL支持数组、集合和记录等复合类型,这些使得处理复杂数据结构变得可能。手册会详细介绍这些类型的创建和使用。 7. **包(Packages)**:包是将相关的过程、函数和变量封装在一起的一种方式,...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的...

    PL/SQL安装包

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL与过程编程的语言,用于在Oracle环境中开发数据库应用程序。PL代表Procedural Language,SQL则代表Structured Query Language。这个"PL/SQL安装包...

    PL/SQL编程基础知识

    - **程序包**:集合了一系列相关的子程序、类型定义和其他PL/SQL元素,便于管理和复用。 **2.3 标识符规则** PL/SQL中的标识符遵循以下规则: - 标识符长度不能超过30个字符。 - 第一个字符必须是字母。 - 不区分...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    《Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发》是一本深入探讨Oracle数据库中的PL/SQL编程的专业书籍。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库...

    PL/SQL用户指南与参考

    #### 第五章:PL/SQL集合与记录 ##### 一、什么是集合 集合是一组相同类型的数据的集合。 ##### 二、集合类型的选择 选择合适的集合类型对于提高性能至关重要,如`ARRAY`、`VARRAY`等。 ##### 三、定义集合类型 ...

    PL/SQL入门到精通书的源代码

    5. **过程与函数**:过程是一组PL/SQL语句的集合,用于执行特定任务。函数与过程类似,但返回一个值。它们可以提高代码的复用性和模块化。 6. **异常处理**:PL/SQL提供了一个强大的异常处理机制,允许你定义和捕获...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    5. **集合类型**:包括数组(PLS_INTEGER索引的PL/SQL表)和关联数组(索引由非数字类型的值定义),以及如何在集合中插入、删除和迭代元素。 6. **包(PACKAGE)**:创建和使用包来组织相关的过程和函数,实现模块...

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    pl/sql 学习资料

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程式编程的高级语言,主要用于数据库管理和应用程序开发。在这个“PL/SQL学习资料”压缩包中,包含了十一个PDF文件,覆盖了从基础到进阶的...

    精通pl/sql

    《精通PL/SQL》这本书是针对Oracle数据库系统中PL/SQL编程语言的深度解析与实践指南,主要面向希望提升在Oracle环境下使用PL/SQL技能的专业人士。PL/SQL,全称为Procedural Language/Structured Query Language,是...

    PL/SQL编程(电子版)

    3. 可存储与可重用:PL/SQL块可以被命名并存储在数据库中,便于重复使用,并可通过任何客户/服务器工具访问。 4. 安全性:可以通过Oracle数据工具管理PL/SQL程序的安全性,授权或撤销用户访问权限。 5. 平台无关性:...

    oracle pl/sql fundamentals

    7. **记录和指针**:理解PL/SQL中的记录类型,以及如何使用指针在记录和集合中移动。 8. **动态SQL**:了解如何在PL/SQL中构建和执行动态SQL语句,以适应不断变化的查询需求。 9. **事务管理**:学习如何控制事务...

    精通Oracle 10g SQL和PL/SQL

    通过学习本书 读者不仅可以掌握编写sql语句和pl/sql块的基础知识 而且还可以掌握sql高级特征 正则表达式 flashback查询 merge语句 sql:1999连接 和pl/sql高级特征 记录类型 集合类型 对象类型等  本书不仅适合...

    PL/SQL development9.0.3

    2. **变量和数据类型**:PL/SQL支持多种内置数据类型,如NUMBER、VARCHAR2、DATE等,以及PL/SQL特有的记录和集合类型。 3. **流程控制语句**:包括IF-THEN-ELSIF-ELSE、CASE、FOR循环、WHILE循环等,用于控制程序的...

    PL/SQL学习笔记

    关联数组是一种允许以任意字符串作为索引的数组,常用于将PL/SQL表与程序中的数组结构相对应。关联数组的操作包括遍历、添加元素、修改元素和删除元素等。 异常处理是PL/SQL的一个重要特性。PL/SQL定义了多种类型的...

    Pl/SQL programming 超全经典官方多本书籍资料

    本资源集合包含了关于PL/SQL编程的多本官方经典书籍,对于学习和深入理解PL/SQL至关重要。 1. **《PLSQL User's Guide and Reference》** 这本书是Oracle官方提供的基础指南,全面涵盖了PL/SQL的语法、语句、函数和...

    PL/SQL 用户指南与参考

    #### 第五章 PL/SQL集合与记录 - **集合**: - **TABLE**:有序集合,支持重复元素。 - **VARRAY**:变长数组,长度固定但元素可变。 - **记录**: - 定义记录类型,存储不同类型的值。 #### 第六章 PL/SQL与...

    PL/SQL语法帮助

    - **记录和集合**:用于存储多条数据,可以是自定义类型的记录或标准的PL/SQL集合类型。 - **包**:封装相关的过程、函数和变量,提供模块化的代码组织。 学习PL/SQL不仅有助于你更好地管理Oracle数据库,还能提升...

    ORALCE PL/SQL程序设计第五版

    4. **集合和记录类型**:PL/SQL支持集合类型,如数组和关联数组,以及自定义记录类型,这些允许你存储和操作多条数据。集合和记录类型大大增强了处理复杂数据结构的能力。 5. **索引和触发器**:在Oracle数据库中,...

Global site tag (gtag.js) - Google Analytics