
# U0100092: 目标数据库不支持MULTISET与CAST结合使用
#### 描述
GaussDB 不支持MULTISET与CAST结合使用。
**数据库类型与版本**
- 源库类型与版本：UGO 支持的 Oracle 版本。
- 目标库类型与版本：UGO 支持的 GaussDB 版本。
**语法示例**
```
CREATE OR REPLACE FUNCTION MULTISET_test RETURN tbl_int
AS
  v_tbl_int tbl_int := tbl_int();
BEGIN 
  SELECT COLUMN_VALUE 
  BULK COLLECT INTO v_tbl_int
  FROM t1, TABLE(CAST(MULTISET(
    SELECT t2.c4 FROM t2 WHERE t1.c1 = t2.c3
  ) AS tbl_int)) a;
  FOR i IN 1..v_tbl_int.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE('v_tbl_int ' || i || ': ' || v_tbl_int(i));
 end loop;
  RETURN v_tbl_int;
END;
/
```
#### 改造建议
改写思路如下：
1.首先将UNNEST_TABLE函数里面的子查询提取处理。
2.声明一个中间集合类型，初始化的集合类型。
3.将子查询的结果集bulk collect into 中间集合类型，如果条件列，涉及多个表，需要写成多表关联的方式。
4.UNNEST_TABLE函数的子查询替换为中间集合类型。
**GaussDB改造后：**
```
CREATE OR REPLACE FUNCTION MULTISET_test RETURN tbl_int
AS
  v_tbl_int tbl_int := tbl_int();
  tbl_int2 tbl_int := tbl_int();
BEGIN 
  SELECT t2.c4 bulk collect into tbl_int2 FROM t1,t2 WHERE t1.c1 = t2.c3;
  SELECT COLUMN_VALUE 
  BULK COLLECT INTO v_tbl_int
  FROM t1, UNNEST_TABLE(tbl_int2) a (COLUMN_VALUE);
  FOR i IN 1..v_tbl_int.COUNT LOOP
      DBE_OUTPUT.PRINT_LINE('v_tbl_int ' || i || ': ' || v_tbl_int(i));
 end loop;
  RETURN v_tbl_int;
END;
/
```
