---
title: Oracle 模式复杂嵌套类型兼容问题-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于Oracle 模式复杂嵌套类型兼容问题相关的常见问题和使用技巧，帮助您快速解决Oracle 模式复杂嵌套类型兼容问题的难题。
---
切换语言

- 简体中文
- English

划线反馈

# Oracle 模式复杂嵌套类型兼容问题

更新时间：2026-05-29 08:46

适用版本： V4.0.x、V4.1.x、V4.2.x 内容类型：Troubleshoot  

本文介绍 Oracle 模式复杂嵌套类型兼容问题。

## 适用版本

OceanBase 数据库 V4.x 版本

## 问题现象

`SELECT * FROM TABLE ( pt_house )` 语法报错如下，其中 `pt_house` 为复杂嵌套类型。

```shell
ORA-00600: internal error code, arguments: -4007, table(coll(object)) : object`s element is not basic type not supported at line 4, position 6

```

相关 TYPE 定义。

```shell
CREATE OR REPLACE TYPE typ_bed AS OBJECT (
        bed_id   INT,
        bed_name VARCHAR2(16)
);

CREATE OR REPLACE TYPE typ_beds IS
    TABLE OF typ_bed;

CREATE OR REPLACE TYPE typ_room AS OBJECT (
        room_id   INT,
        room_name VARCHAR2(16),
        beds      typ_beds
);

CREATE OR REPLACE TYPE typ_house IS
    TABLE OF typ_room;

FUNCTION fn_house_test 定义：

CREATE OR REPLACE FUNCTION fn_house_test (
    pt_house IN typ_house
) RETURN NUMBER IS
    CURSOR cur_house IS
    SELECT
        *
    FROM
        TABLE ( pt_house );

BEGIN
    RETURN 1;
END;
/

```

## 问题原因

目前 OceanBase 数据库 V4.x table (嵌套类型) 仅支持如下简单嵌套类型，暂不支持复杂嵌套类型。

- 简单嵌套类型 `table(collection(record(basic type)))`
 - 复杂嵌套类型 `table(collection(collection(record(basic type))))`

## 解决方法

可以采用多层 FOR LOOP 的方式遍历复杂嵌套类型。

```shell
CREATE OR REPLACE PROCEDURE print_typ_house (
    p_typ_house IN typ_house
) IS
BEGIN
    FOR i IN 1..p_typ_house.count LOOP
        dbms_output.put_line('room_id: ' || p_typ_house(i).room_id);
        dbms_output.put_line('room_name: ' || p_typ_house(i).room_name);
        FOR j IN 1..p_typ_house(i).beds.count LOOP
            dbms_output.put_line('  house ('
                                 || j
                                 || '):');
            dbms_output.put_line('    bed_id: '
                                 || p_typ_house(i).beds(j).bed_id);

            dbms_output.put_line('    bed_name: '
                                 || p_typ_house(i).beds(j).bed_name);

        END LOOP;

        dbms_output.put_line('-----------------------------');
    END LOOP;
END print_typ_house;
/

```

测试用例。

```shell
DECLARE
    bed1       typ_bed := typ_bed(1, 'Bed 1');
    bed2       typ_bed := typ_bed(2, 'Bed 2');
    v_typ_beds typ_beds := typ_beds(bed1, bed2);
    room1      typ_room := typ_room(101, 'Room 1', v_typ_beds);
    room2      typ_room := typ_room(102, 'Room 2', v_typ_beds);
    house1     typ_house := typ_house(room1, room2);
BEGIN
    print_typ_house(house1);
END;
/

```

测试结果。

```shell
DBMS 输出
room_id: 101
room_name: Room 1
  house (1):
    bed_id: 1
    bed_name: Bed 1
  house (2):
    bed_id: 2
    bed_name: Bed 2
-----------------------------
room_id: 102
room_name: Room 2
  house (1):
    bed_id: 1
    bed_name: Bed 1
  house (2):
    bed_id: 2
    bed_name: Bed 2
-----------------------------

```

Previous

[PL 常见问题](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000001051)

Next

[Oracle 兼容模式，通过 user_errors 视图查看包/包体/存储过程等对象上次编译错误信息](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000481849) ![有帮助](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) 咨询热线
