我有一个函数(在视图中使用),最终结果是逗号分隔值表格中行的唯一值列表。oracle值存在于集合中
本质上给出的表:
studentid classes
12345 MATH 1301, HIST 1301, POLS 1301
57495 MATH 2309, HIST 1301
39485 MATH 1301, HIST 1301
我想看看
MATH 1301
MATH 2309
HIST 1301
POLS 1301
下面的代码工作完美的,如果源表虽小,但看30000行的表时,我得到以下错误。 ORA-06532: Subscript outside of limit
我很确定我的问题是集合越来越大,因为它得到重复的值。当集合变得太大时,重复值本身只会成为一个问题。如何将重复值保存在集合中?
我试过childnames.exists(element)但我相信这只适用于查看索引值element是否存在正确的元素?我看过member of,但我不明白如何实现它..是否有一个简单的方法来检查一个集合元素是否存在?或者我看起来很简单?除odcivarchar2list之外是否有其他类型可以允许更大的收藏?
CREATE OR REPLACE FUNCTION unique_values_from_csv (p_del VARCHAR2 := ',')
RETURN SYS.odcivarchar2list
IS
childnames SYS.odcivarchar2list := sys.odcivarchar2list();
tempvar VARCHAR2(255);
l_idx PLS_INTEGER;
l_list2 VARCHAR2(32767) ;
l_value VARCHAR2(32767);
CURSOR tablewalker_cur
IS
SELECT distinct classes
FROM studentclasses;
BEGIN
FOR recordwalker_rec IN tablewalker_cur
LOOP
l_list2 := recordwalker_rec.classes;
LOOP
l_idx := INSTR (l_list2, p_del);
IF l_idx > 0
THEN
childnames.EXTEND;
tempvar := (LTRIM (RTRIM (SUBSTR (l_list2, 1, l_idx - 1))));
childnames (childnames.COUNT) := tempvar;
l_list2 := SUBSTR (l_list2, l_idx + LENGTH (p_del));
end if;
childnames.EXTEND;
childnames (childnames.COUNT) := (LTRIM (RTRIM (l_list2)));
EXIT;
END LOOP;
END LOOP;
RETURN childnames;
END unique_values_from_csv;
/
2013-03-06
dangel