【问题标题】:How to retrieve distinct values from nested table in Oracle如何从Oracle中的嵌套表中检索不同的值
【发布时间】:2015-10-06 05:02:41
【问题描述】:

我有一个问题,我需要从嵌套表集合中检索不同的值。

示例代码:

FUNCTION get_part_atts
       ( p_gp_id IN dummy_di_parts.di_gp_id%TYPE
       , p_attribute_name   IN dummy_part_attr_def.attribute_name%TYPE
       , p_sel1        IN dummy_di_part_atts.sel1%TYPE DEFAULT NULL
       , p_sel2        IN dummy_di_part_atts.sel2%TYPE DEFAULT NULL
       , p_sel3        IN dummy_di_part_atts.sel3%TYPE DEFAULT NULL )
    RETURN dummy_pkg.part_atts_tabtype
    RESULT_CACHE
    IS

l_dummy_part_seq  dummy_di_parts.dummy_part_seq%TYPE;
l_attribute_id       dummy_part_attr_def.attribute_id%TYPE;
l_default_value      dummy_part_attr_def.default_value%TYPE;

l_return part_atts_tabtype := part_atts_tabtype();

BEGIN

  SELECT p.dummy_part_seq
    INTO l_dummy_part_seq
    FROM dummy_di_parts p
   WHERE p.di_gp_id = p_gp_id
     AND p.di_part_status = 'ACTIVE';

EXCEPTION
WHEN NO_DATA_FOUND
THEN RAISE_APPLICATION_ERROR(-20021,'No active parts found  '||p_gp_id||'.');
WHEN TOO_MANY_ROWS
THEN RAISE_APPLICATION_ERROR(-20022,'More than one active part  '||p_gp_id||'.');
END part_lookup; 

BEGIN

  SELECT pad.attribute_id
       , pad.default_value
    INTO l_attribute_id
       , l_default_value
    FROM dummy_part_attr_def pad
   WHERE pad.attribute_name = p_attribute_name;

EXCEPTION
WHEN NO_DATA_FOUND
THEN RAISE_APPLICATION_ERROR(-20023,p_attribute_name||' is not a valid  attribute name.');
END attribute_def_lookup;


SELECT pa.attribute_value
  BULK COLLECT INTO l_return
  FROM dummy_di_part_atts pa
 WHERE pa.dummy_part_seq = l_dummy_part_seq
   AND pa.attribute_id = l_attribute_id
   AND ( p_sel1 IS NULL OR
         pa.sel1 = p_sel1 )
   AND ( p_sel2 IS NULL OR
         pa.sel2 = p_sel2 )
   AND ( p_sel3 IS NULL OR
         pa.sel3 = p_sel3 );

  RETURN l_return;

END get_part_atts;

现在我需要从集合 l_return 中选择 Distinct,它是一个嵌套表类型

请帮忙

【问题讨论】:

  • 另外,我无法更改此函数以在选择查询中包含 Distinct,因为它是从各种其他程序和应用程序调用的。我正在寻找一种解决方案,让我可以从返回的集合中脱颖而出

标签: oracle collections distinct-values nested-table


【解决方案1】:

在 Oracle 12C 中,您可以这样做:

select distinct attribute_value
from table (get_part_atts(...))

在 12C 之前,您可以执行类似操作,但前提是该类型是使用 CREATE TYPE 在数据库中定义的,而不是在包规范中声明的。

【讨论】:

  • 嗨 Tony,集合的 SET 运算符怎么样。“SET 运算符首先将嵌套表转换为集合,从集合中删除重复元素,并将集合作为嵌套表返回。”跨度>
【解决方案2】:

尝试使用“multiset union distinct”。例如,将分隔字符串拆分为标记并返回嵌套表的函数:

CREATE OR REPLACE function fn_split(i_string in varchar2, i_delimiter in varchar2 default ',', b_dedup_tokens in number default 0)
return sys.dbms_debug_vc2coll
as
  l_tab sys.dbms_debug_vc2coll;
begin
  select regexp_substr(i_string,'[^' || i_delimiter || ']+', 1, level)
  bulk collect into l_tab
  from dual
  connect by regexp_substr(i_string, '[^' || i_delimiter || ']+', 1, level) is not null
  order by level;

  if (b_dedup_tokens > 0) then
    return l_tab multiset union distinct l_tab;
  end if;
  return l_tab;
end;

测试:

select * from table(fn_split('x,x,y,z', ',', 1));

输出:

COLUMN_VALUE
x
y
z

【讨论】:

  • 非常感谢 tbone..Multiset union distinct 似乎正在工作。我还需要测试它。如果我遇到任何问题,我会回来。非常感谢您的帮助。
  • 你好,集合的 SET 运算符怎么样。“SET 运算符首先将嵌套表转换为集合,从集合中删除重复元素,并将集合作为嵌套表返回。”跨度>
  • @Tina 集合运算符在 Oracle 中处理数据集(想想维恩图或“气泡图”)。联合、相交、减号等。这是您想要的,但是在 pl/sql 中使用嵌套表时,您将使用“multiset union”而不是“union”,就像查询常规表一样。 “不同”将删除结果。有关更多信息,请参阅here
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
相关资源
最近更新 更多