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