我有函数(在视图中使用),最终结果是逗号分隔值表中一行的唯一值列表。
基本上给出了一个表格:
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
如果源表很小,则以下代码可以完美运行,但是在查看包含 30,000 行的表时,会出现以下错误。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;
/