键的数据类型可以是 PLS_INTEGER 或 VARCHAR2 (长度)。

  • 如果键的数据类型是 PLS_INTEGER,关联数组是按整数索引(indexed by integer)并且是密集型(指元素之间没有空隙),则从第一个元素到最后一个元素之间的每个元素都是有定义的,并且有值(值可以是 NULL )。

  • 如果键的数据类型是 VARCHAR2(长度),关联数组是按字符串索引(indexed by string)并且是稀疏型(指元素之间可能有空隙)。

当遍历密集的关联数组时,不需要考虑元素之间的空隙;当遍历稀疏的关联数组时,需要留意空隙。

给一个关联数组元素赋值,可以使用赋值表达式:

如果键不在数组中,这个赋值语句就会向数组中添加一个键值对;否则,赋值语句就修改了该键对应的值为新的值。

如果在包里面定义关联数组变量,在包体里面给它赋值,则关联数组在数据库会话期间都保持可见;否则,它只在所在的子程序范围内可见。

要声明关联数组,需要先声明一个关联数组类型,然后声明这个类型的一个变量。最简单的语法格式如下:

示例:声明关联数组

最有效的填充一个密集型关联数组的方式是使用 SELECT INTO 语句带上 BULK COLLECT INTO 子句。

注意

如果一个密集型关联数组要填充的内容非常多,以至于 SELECT 语句会返回一个很大的结果集导致内存放不下,那么不要使用 SELECT 语句。可以通过游标和 FETCH 语句带上 BULK COLLECT INTO 和 LIMIT 子句来填充。

下面示例使用 SELECT 语句填充按整型索引的关联数组,然后使用 FOR LOOP 语句填充一个按字符串索引的稀疏型关联数组。

示例:填充关联数组

  1. BEGIN
  2. -- 填充关联数组
  3. SELECT "W_ID","W_YTD","W_TAX","W_NAME","W_STREET_1","W_STREET_2","W_CITY","W_STATE","W_ZIP"
  4. tab_ware_cities( tab_wares(i).w_name ) := tab_wares(i).w_city ;
  5. END LOOP;
  6. END;

密集型关联数组(按整型索引)的元素之间没有空隙,每个位于第一个和最后一个元素之间的元素都有定义和值(这个值可以是 NULL),可以使用 FOR LOOP 语句遍历一个密集型关联数组。

下面示例使用 FOR LOOP 语句去打印关联数组的每个元素值。其中,FOR LOOP 语句的上限 tab _wares.COUNT 调用了集合的方法 COUNT 返回数组中元素数目。

示例:遍历密集型关联数组

结果输出:

  1. Query OK, 0 rows affected (0.12 sec)
  2. 1 n1P4zYo8OH srRq15uvxe5