---
title: "集合构造函数 - OceanBase 数据库 V4.2.5 | OceanBase 文档中心"
description: 集合构造函数 集合构造函数是与集合类型同名的系统定义函数，该函数返回该类型的集合。 功能适用性 该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。 说明 构造函数仅适用于可变数组和嵌套表。关联数组没有构造函数。在本文中，集合是指可变数组或嵌套表。 调用构造函数…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.2.5 LTS

# 集合构造函数

更新时间：2026-07-15 20:56:58

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.5/zh-CN/700.reference/500.sql-reference/300.pl-reference/300.pl-oracle/400.collections-and-records-oracle/600.collection-constructor-oracle.md)  

集合构造函数是与集合类型同名的系统定义函数，该函数返回该类型的集合。

#### 功能适用性

该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。

#### 说明

构造函数仅适用于可变数组和嵌套表。关联数组没有构造函数。在本文中，集合是指可变数组或嵌套表。

调用构造函数的语法如下：

```javascript
collection_type ( [ value [, value ]... ] )

```

其中，`collection_type` 是指先前声明的嵌套表类型或可变数组类型（不是关联数组类型）的名称；`value` 是指集合元素 `collection_type` 的有效值。如果 `collection_type` 是可变数组类型，则具有最大值，值的数量不能超过该最大值。如果 `collection_type` 是嵌套表类型，则没有最大值。

如果参数列表为空，则构造函数将返回一个空集合。否则，构造函数将返回一个包含指定值的集合。

您可以在变量声明和块的可执行部分中将返回的集合分配给（相同类型的）集合变量。

**示例：将集合变量初始化为空值。**

```javascript
obclient> DECLARE
  TYPE players IS VARRAY(5) OF VARCHAR2(20);
  team PLAYERS := players();   --初始化为空值

  PROCEDURE print_team (heading VARCHAR2) IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(heading);
    IF team.COUNT = 0 THEN
      DBMS_OUTPUT.PUT_LINE('Empty');
    ELSE
      FOR i IN 1..5 LOOP
        DBMS_OUTPUT.PUT_LINE(i || '.' || team(i));
      END LOOP;
    END IF;
    DBMS_OUTPUT.PUT_LINE('---');
  END;

BEGIN
  print_team('Team Members:');
  team := players('Charles', 'Carl', 'James', 'Gary','Brian');
  print_team('Team Members:');
END;
/
Query OK, 0 rows affected

Team Members:
Empty
---
Team Members:
1.Charles
2.Carl
3.James
4.Gary
5.Brian
---

```

上述示例两次调用了构造函数：先将可变数组变量 `team`​ 初始化为空，然后在该块的可执行部分为其赋予新值。​`print_team`​ 存储过程显示 `team` ​的初始值和最终值。​`print_team` ​使用了集合方法 ​`COUNT`​ 来确定 ​​`team`​ 是否为空。

**示例：关联数组通过构造函数指定 index 和 element**

```sql
obclient> declare
    ->     type rec_type is record (
    ->         id number,
    ->         name varchar2(50),
    ->         salary number
    ->     );
    ->     type ty_rec is table of rec_type index by PLS_INTEGER;
    ->     v_rec ty_rec;
    ->     idx PLS_INTEGER;
    -> begin
    ->     v_rec := ty_rec(1 => rec_type(1, 'Alice', 5000),2 => rec_type(2, 'Bob', 6000),3 => rec_type(3, 'Charlie', 7000));
    ->     idx := v_rec.FIRST();
    ->     while idx is not null loop
    ->         dbms_output.put_line('ID: ' || v_rec(idx).id || ', Name: ' || v_rec(idx).name || ', Salary: ' || v_rec(idx).salary);
    ->         idx := v_rec.NEXT(idx);
    ->     end loop;
    -> end;
    -> /
Query OK, 0 rows affected (0.146 sec)

ID: 1, Name: Alice, Salary: 5000
ID: 2, Name: Bob, Salary: 6000
ID: 3, Name: Charlie, Salary: 7000

```

上述例子先定义了一个 `record` 类型，然后定义了一个 `ty_rec` 的关联数组类型，`index` 是 `PLS_INTEGER` 类型，`element` 类型是 `rec_type` 类型，`v_rec` 是一个 `ty_rec` 的关联数组变量，通过带 `=>` 的构造函数指定 `index` 与其对应的 `element` ，然后枚举关联数组将其全部元素一一输出。

同时关联数组还支持不指定 `index` 的构造函数（即不带 `=>` 的构造函数，仅限 `index` 是 `PLS_INTEGER` 类型的关联数组），这种情况下 `index` 会默认从 `1` 开始递增计数，示例如下：

```sql
obclient> declare
    ->     type ty1 is table of int index by PLS_INTEGER;
    ->     x ty1;
    ->     idx PLS_INTEGER;
    -> begin
    ->     x := ty1(10, 20, 30);
    ->     idx := x.FIRST();
    ->     while idx is not null loop
    ->       dbms_output.put_line('index: ' || idx || ', Element: ' || x(idx));
    ->       idx := x.NEXT(idx);
    ->     end loop;
    -> end;
    -> /
Query OK, 0 rows affected (0.122 sec)

index: 1, Element: 10
index: 2, Element: 20
index: 3, Element: 30

```

上述例子先声明了一个 `index` 为 `PLS_INTEGER` 类型且 `element` 类型为 `int` 的关联数组类型 `ty1`，然后声明 `x` 为 `ty1` 类型的变量，然后在 `ty1` 构造函数内直接指明 `element` 的值赋值给 `x`，然后依次遍历 `x` 的 `index` 与 `element` 并输出。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
