create or replace type num_tab_type as table of number
Type created.
create or replace procedure dump_num_tab( p_nt num_tab_type )
is
begin
if p_nt is null then
dbms_output.put_line('NULL');
else
dbms_output.put_line('Count: '||p_nt.count);
for i in 1..p_nt.count loop
dbms_output.put_line(lpad(i,5)||': '||p_nt(i));
end loop;
end if;
end dump_num_tab;
Procedure created.
create or replace function num_tab_complement ( p_nt_1 num_tab_type, p_nt_2 num_tab_type)
return num_tab_type
is
v_retval num_tab_type;
v_retcnt number := 0;
v_present boolean;
begin
-- The Do-It-Yourself way to get the "relative complement" of two sets
-- Too much work :-(
v_retval := num_tab_type();
if p_nt_1 is not null then
for i in 1..p_nt_1.count loop
v_present := false;
if p_nt_2 is not null then
for j in 1..p_nt_2.count loop
if p_nt_1(i) = p_nt_2(j) then
v_present := true;
exit;
end if;
end loop;
end if;
if not v_present then
v_retval.extend(1);
v_retcnt := v_retcnt + 1;
v_retval(v_retcnt) := p_nt_1(i);
end if;
end loop;
end if;
return v_retval;
end num_tab_complement;
Function created.
declare
nt1 num_tab_type;
nt2 num_tab_type;
nt3 num_tab_type;
begin
dbms_output.put_line('-- case 1 --');
nt1 := num_tab_type(1,2,3);
nt2 := num_tab_type(2,4);
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 2 --');
nt1 := num_tab_type(1,2,3);
nt2 := num_tab_type(4,3,2,1);
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 3 --');
nt1 := num_tab_type(1,2,3);
nt2 := num_tab_type();
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 4 --');
nt1 := num_tab_type(1,2,3);
nt2 := NULL;
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 5 --');
nt1 := num_tab_type();
nt2 := num_tab_type(2,4);
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 6 --');
nt1 := NULL;
nt2 := num_tab_type(2,4);
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
end;
-- case 1 --
Count: 2
1: 1
2: 3
-- case 2 --
Count: 0
-- case 3 --
Count: 3
1: 1
2: 2
3: 3
-- case 4 --
Count: 3
1: 1
2: 2
3: 3
-- case 5 --
Count: 0
-- case 6 --
Count: 0
create or replace function num_tab_complement ( p_nt_1 num_tab_type, p_nt_2 num_tab_type)
return num_tab_type
is
begin
-- The Built-In way to get the "relative complement" of two sets
-- Much less work :-)
return
case
when p_nt_1 is null then
num_tab_type()
when p_nt_2 is null then
p_nt_1
else
p_nt_1 multiset except all p_nt_2
end;
end num_tab_complement;
Function created.
declare
nt1 num_tab_type;
nt2 num_tab_type;
nt3 num_tab_type;
begin
dbms_output.put_line('-- case 1 --');
nt1 := num_tab_type(1,2,3);
nt2 := num_tab_type(2,4);
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 2 --');
nt1 := num_tab_type(1,2,3);
nt2 := num_tab_type(4,3,2,1);
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 3 --');
nt1 := num_tab_type(1,2,3);
nt2 := num_tab_type();
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 4 --');
nt1 := num_tab_type(1,2,3);
nt2 := NULL;
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 5 --');
nt1 := num_tab_type();
nt2 := num_tab_type(2,4);
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
dbms_output.put_line('-- case 6 --');
nt1 := NULL;
nt2 := num_tab_type(2,4);
nt3 := num_tab_complement(nt1, nt2);
dump_num_tab(nt3);
end;
-- case 1 --
Count: 2
1: 1
2: 3
-- case 2 --
Count: 0
-- case 3 --
Count: 3
1: 1
2: 2
3: 3
-- case 4 --
Count: 3
1: 1
2: 2
3: 3
-- case 5 --
Count: 0
-- case 6 --
Count: 0