更新时间:2026-03-19 GMT+08:00
分享

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;
/

相关文档