我知道使用SET运算符我们可以忽略或找到pl sql集合中的重复值。据我所知,SET运算符只能找到具有相同大小写的重复项(所有值都在较低的pr大写字母中)。如果有人能解释如何找到重复项,无论区分大小写,那将是很棒的。
非常感谢您的帮助。
这就是你现在拥有的:
SQL> declare
2 type lt is table of varchar2(10);
3 l_col lt := lt ('A', 'A', 'B', 'a', 'b');
4 l_set lt;
5 begin
6 dbms_output.put_line('Original -----');
7 for i in l_col.first .. l_col.last loop
8 dbms_output.put_line(l_col(i));
9 end loop;
10
11 dbms_output.put_line('Set ----------');
12 l_set := set(l_col);
13 for i in l_set.first .. l_set.last loop
14 dbms_output.put_line(l_set(i));
15 end loop;
16 end;
17 /
Original -----
A
A
B
a
b
Set ----------
A --> this "A" is "duplicate" of ...
B
a --> ... this "a"
b
PL/SQL procedure successfully completed.
SQL>
一个选项(摆脱那些重复)是切换到不区分大小写的搜索选项:
SQL> alter session set nls_comp = linguistic;
Session altered.
SQL> alter session set nls_sort = binary_ai;
Session altered.
现在,运行相同的PL / SQL代码,结果是:
SQL> declare
2 type lt is table of varchar2(10);
3 l_col lt := lt ('A', 'A', 'B', 'a', 'b');
4 l_set lt;
5 begin
6 dbms_output.put_line('Original -----');
7 for i in l_col.first .. l_col.last loop
8 dbms_output.put_line(l_col(i));
9 end loop;
10
11 dbms_output.put_line('Set ----------');
12 l_set := set(l_col);
13 for i in l_set.first .. l_set.last loop
14 dbms_output.put_line(l_set(i));
15 end loop;
16 end;
17 /
Original -----
A
A
B
a
b
Set ----------
A --> no more duplicates
B
PL/SQL procedure successfully completed.
SQL>
[编辑]
关于你无法在存储过程(包,无论如何)中改变会话的评论,你可以使用动态SQL做到这一点。这是一个演示(注释第6和第7行):
SQL> declare
2 type lt is table of varchar2(10);
3 l_col lt := lt ('A', 'A', 'B', 'a', 'b');
4 l_set lt;
5 begin
6 execute immediate 'alter session set nls_comp = linguistic';
7 execute immediate 'alter session set nls_sort = binary_ai';
8
9 dbms_output.put_line('Original -----');
10 for i in l_col.first .. l_col.last loop
11 dbms_output.put_line(l_col(i));
12 end loop;
13
14 dbms_output.put_line('Set ----------');
15 l_set := set(l_col);
16 for i in l_set.first .. l_set.last loop
17 dbms_output.put_line(l_set(i));
18 end loop;
19 end;
20 /
Original -----
A
A
B
a
b
Set ----------
A
B
PL/SQL procedure successfully completed.
SQL>
如果您不想这样做,我想您必须将集合内容“导出”到表中(甚至可能是全局/私有临时表,具体取决于您使用的数据库版本),消除重复项并填充仅具有不同值的集合。