我已经看到了几个使用MULTISET UNION DISTINCT
和SET
删除Oracle关联数组中重复项的很好的例子。当只有一列时它很有用。
我有一个基于RECORD
类型的关联数组,其中包含3列。
是否可以使用上述方法?
DECLARE
TYPE rec_type IS RECORD(
column1 VARCHAR2(5)
,column2 VARCHAR2(5));
TYPE my_aa IS TABLE OF rec_type;
p_tbl my_aa := my_aa();
q_tbl my_aa := my_aa();
BEGIN
p_tbl.extend(4);
p_tbl(1).column1 := 'A1';
p_tbl(1).column2 := 'a';
--
p_tbl(2).column1 := 'A1';
p_tbl(2).column2 := 'b';
--
p_tbl(3).column1 := 'A1'; -- Dup
p_tbl(3).column2 := 'a'; -- Dup
--
p_tbl(4).column1 := 'A1';
p_tbl(4).column2 := 'c';
--
dbms_output.put_line('-- First output contains duplicated');
--
FOR a IN p_tbl.first .. p_tbl.last LOOP
dbms_output.put_line(a || ' = ' || p_tbl(a).column1 || ' / ' || p_tbl(a).column2);
END LOOP;
--
--
q_tbl := p_tbl MULTISET UNION DISTINCT p_tbl;
--
--
dbms_output.new_line;
dbms_output.put_line('-- Duplicates have been removad');
FOR a IN q_tbl.first .. q_tbl.last LOOP
dbms_output.put_line(a || ' = ' || q_tbl(a).column1|| ' / '||q_tbl(a).column2);
END LOOP;
END;
答案 0 :(得分:1)
由于文档
,无法区分MULTISET UNION DISTINCT
基础RECORD
类型
嵌套表的元素类型必须具有可比性。请 有关可比性的信息,请参阅“比较条件” 非标量类型。 https://docs.oracle.com/cd/B12037_01/server.101/b10759/operators006.htm
记录无法比较。您可以将具有MAP
方法的用户定义对象用于此
如果它们是相同的,则两个非标量类型的对象是可比较的 命名类型和他们之间有一对一的对应关系 元素。此外,用户定义的对象类型的嵌套表, 即使它们的元素具有可比性,也必须定义MAP方法 在他们身上用于平等或IN条件。 https://docs.oracle.com/cd/B12037_01/server.101/b10759/conditions002.htm#i1033286
如果您仍然使用记录执行此操作,请尝试使用SELECT DISTINCT ... FROM TABLE()
方法,但必须在架构级别上为oracle 12c之前的服务器定义类型。