本文介绍 Oracle 模式复杂嵌套类型兼容问题。
适用版本
OceanBase 数据库 V4.x 版本
问题现象
SELECT * FROM TABLE ( pt_house ) 语法报错如下,其中 pt_house 为复杂嵌套类型。
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 定义。
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 的方式遍历复杂嵌套类型。
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;
/
测试用例。
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;
/
测试结果。
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
-----------------------------