関数 (ビュー内で使用) があり、最終結果はカンマ区切りの値のテーブル内の行からの一意の値のリストです。
基本的に、次の表が与えられます。
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;
/